/*++ Copyright (c) 1998 Gemplus Development Name: gprnt.h Description: This module holds the prototypes of the functions from gprnt.C + MACRO and structures declarations Environment: Kernel Mode Revision History: 22/11/98: V1.00.004 (Y. Nadeau) - Add KEvent ReaderRemoved 06/05/98: V1.00.003 (P. Plouidy) - Power management for NT5 10/02/98: V1.00.002 (P. Plouidy) - Plug and Play for NT5 03/07/97: V1.00.001 (P. Plouidy) - Start of development. --*/ #define SMARTCARD_POOL_TAG 'bGCS' // // Include // // - smclib.h: smart card library definitions. // #include #include #ifndef _GPRNT_ #define _GPRNT_ // // Constant section // #define SC_VENDOR_NAME "Gemplus" #define SC_DRIVER_NAME "GPR400" #define SC_IFD_TYPE "GPR400" #define GPR_DEFAULT_FREQUENCY 3686 #define GPR_MAX_FREQUENCY 3686 #define GPR_MAX_IFSD 253 #define GPR_DEFAULT_DATARATE 9909 #define GPR_MAX_DATARATE 9909 #define GPR_MAX_DEVICE 4 #define GPR_DEFAULT_TIME 120l // Exchange Cmd #define GPR_CMD_TIME 5 // Gpr Cmd only #define GPR_DEFAULT_POWER_TIME 0 #define GPR_BUFFER_SIZE 262 // DRIVER FLAVOR // 0 : Gemplus GPR400 // 1 : IBM IBM400 // 2 : COMPAQ PC_CARD_SMARTCARD_READER // ... #define DF_GPR400 0 #define DF_IBM400 1 #define DF_CPQ400 2 #define SZ_VENDOR_NAME "GEMPLUS" #define SZ_VENDOR_NAME_IBM "IBM" #define SZ_VENDOR_NAME_COMPAQ "COMPAQ" #define SZ_READER_NAME "GPR400" #define SZ_READER_NAME_IBM "IBM400" #define SZ_READER_NAME_COMPAQ "PC_CARD_SMARTCARD_READER" #define GPR400_ID "\\??\\PCMCIA#GEMPLUS-GPR400" #define COMPAQ_ID "\\??\\PCMCIA#COMPAQ-PC_Card_SmartCard_Reader-446E" #define CHECK_ID_LEN 25 // Check first 25 bytes! // // MACRO declarations. // #ifndef SMARTCARD_NT_LOG #define SMARTCARD_NT_LOG(pObj, lErrCode, pwszStr, ulDump) \ do { \ if (lErrCode != 0) { \ SmartcardLogError(pObj, \ lErrCode, \ pwszStr, \ ulDump); } \ } while (0) #endif #ifndef NT_FAIL #define NT_FAIL(status) (((NTSTATUS) (status)) < 0) #endif #ifndef IS_POINTER_INVALID #define IS_POINTER_INVALID(p) (!IS_POINTER_VALID(p)) #endif #ifndef IS_POINTER_VALID #define IS_POINTER_VALID(p) \ ((BOOLEAN) ((p != NULL) ? TRUE : FALSE)) #endif #ifndef IS_HANDLE_VALID #define IS_HANDLE_VALID(h) \ ((BOOLEAN) ((h == NULL) ? FALSE : TRUE)) #endif #ifndef IS_HANDLE_INVALID #define IS_HANDLE_INVALID(h) (!IS_HANDLE_VALID(h)) #endif #ifndef INIT_STRING #define INIT_STRING(s) \ s.Length = 0; \ s.MaximumLength = 0; \ s.Buffer = NULL #endif // // Data structures. // // PCMCIA_READER_CONFIG:Configuration data structure for PC Card readers. typedef struct _PCMCIA_READER_CONFIG { KIRQL Level; KAFFINITY Affinity; ULONG Vector; USHORT BufferSize; USHORT Reserved; } PCMCIA_READER_CONFIG, *PPCMCIA_READER_CONFIG, *LPPCMCIA_READER_CONFIG; typedef enum _READER_POWER_STATE { PowerReaderUnspecified = 0, PowerReaderWorking, PowerReaderOff } READER_POWER_STATE, *PREADER_POWER_STATE; typedef enum _ACTION { Undefined = 0, SkipRequest, WaitForCompletion, CompleteRequest, MarkPending } ACTION; // GPR400_REGISTERS: GPR400 I/O registers typedef struct _GPR400_REGISTERS { UCHAR ucHandshake; UCHAR ucProgram; UCHAR ucT; UCHAR ucL; UCHAR ucV; UCHAR Dummy[3]; } GPR400_REGISTERS, *PGPR400_REGISTERS, *LPGPR400_REGISTERS; // READER_EXTENSION: typedef struct _READER_EXTENSION { ULONG CmdTimeOut; ULONG PowerTimeOut; PGPR400_REGISTERS BaseIoAddress; PCMCIA_READER_CONFIG ConfigData; KEVENT GPRAckEvent; KEVENT GPRIccPresEvent; KDPC CardDpcObject; KTIMER CardDetectionTimer; UCHAR OsVersion; USHORT Lo; UCHAR To; PUCHAR Vo; READER_POWER_STATE ReaderPowerState; BOOLEAN PowerRequest; PDEVICE_OBJECT AttachedDeviceObject; BOOLEAN CardPresent; // Used to signal that the device has been removed KEVENT ReaderRemoved; BOOLEAN NewDevice; KEVENT IdleState; BOOLEAN RestartCardDetection; } READER_EXTENSION, *PREADER_EXTENSION, *LPREADER_EXTENSION; // DEVICE_EXTENSION: typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT PhysicalDeviceObject; PKINTERRUPT InterruptObject; PKSERVICE_ROUTINE InterruptServiceRoutine; KDPC DpcObject; PVOID IsrContext; SMARTCARD_EXTENSION SmartcardExtension; UNICODE_STRING PnPDeviceName; LONG IoCount; KSPIN_LOCK SpinLock; BOOLEAN OpenFlag; LONG PowerState; KEVENT ReaderStarted; KEVENT ReaderClosed; // A worker thread to startup GPR gently PIO_WORKITEM GprWorkStartup; LONG DriverFlavor; // GPR400(default), IBM400 or CPQ400? PIRP PowerIrp; } DEVICE_EXTENSION, *PDEVICE_EXTENSION, *LPDEVICE_EXTENSION; // // Prototype section: // NTSTATUS DriverEntry ( PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath ); NTSTATUS GprAddDevice ( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ); NTSTATUS GprSystemControl ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS GprDeviceControl ( PDEVICE_OBJECT DeviceObject, PIRP Irp ); NTSTATUS GprCleanup ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); BOOLEAN GprIsr ( IN PKINTERRUPT pkInterrupt, IN PVOID pvContext ); NTSTATUS GprCancelEventWait ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID GprCardEventDpc ( PKDPC Dpc, PDEVICE_OBJECT DeviceObject, PDEVICE_EXTENSION pDevExt, PSMARTCARD_EXTENSION SmartcardExtension ); VOID GprCardPresenceDpc ( IN PKDPC pDpc, IN PVOID pvContext, IN PVOID pArg1, IN PVOID pArg2 ); NTSTATUS GprDispatchPnp ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS GprCallPcmciaDriver ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS GprStartDevice ( PDEVICE_OBJECT DeviceObject, PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor ); VOID GprStopDevice ( PDEVICE_OBJECT DeviceObject ); VOID GprUnloadDriver ( PDRIVER_OBJECT DriverObject ); VOID GprUnloadDevice ( PDEVICE_OBJECT DeviceObject ); NTSTATUS GprCreateClose ( PDEVICE_OBJECT DeviceObject, PIRP Irp ); NTSTATUS GprComplete ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT Event ); NTSTATUS GprCreateDevice ( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PDEVICE_OBJECT *DeviceObject ); /* VOID GprSystemPowerCompletion ( IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PIRP Irp, IN PIO_STATUS_BLOCK IoStatus ); NTSTATUS GprDevicePowerCompletion ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PSMARTCARD_EXTENSION SmartcardExtension ); */ VOID GprFinishPendingRequest ( PDEVICE_OBJECT DeviceObject, NTSTATUS NTStatus ); VOID GprWorkStartup ( IN PDEVICE_OBJECT DeviceObject, IN PVOID Context ); VOID setBusy(PREADER_EXTENSION Device); VOID setIdle(PREADER_EXTENSION Device); NTSTATUS waitForIdle(PREADER_EXTENSION Device); NTSTATUS waitForIdleAndBlock(PREADER_EXTENSION Device); NTSTATUS testForIdleAndBlock(PREADER_EXTENSION Device); NTSTATUS GprPower ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS power_HandleQueryPower(PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS power_HandleSetPower(PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS onDevicePowerUpComplete( IN PDEVICE_OBJECT NullDeviceObject, IN PIRP Irp, IN PVOID DeviceObject ); NTSTATUS onPowerRequestCompletion( IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus ); #define ATTACHED_DEVICE_OBJECT deviceExtension->SmartcardExtension.ReaderExtension->AttachedDeviceObject #endif