/******************************************************************************* * Copyright (c) 1997-1998 Gemplus developpement * * Name : GIOCTL09.H (Gemplus IOCTL Smart card Reader module 09) * * Description : Holds the common definitions for the IOCTL functions for a * GemCore smart card reader * * Release : 1.00.002 * * Last Modif : 22/12/97: V1.00.002 (TFB) * - Modify the maximum IFSD and clock freqency parameters. * 08/07/97: V1.00.001 (GPZ) * - Start of development. * ******************************************************************************** * * Warning : * * Remark : * *******************************************************************************/ #ifndef _GIOSR09_ #define _GIOSR09_ /*------------------------------------------------------------------------------ Constant section: - SC_VENDOR_NAME defines the name of the Smart Card reader vendor. - SC_IFD_NAME defines the type of the Smart Card reader. - SC_IFD_SAM_NAME defines the type of the Smart Card reader for a SAM (Security Access Module). ------------------------------------------------------------------------------*/ #define SC_VENDOR_NAME "Gemplus" #define SC_IFD_TYPE "GemCore Based Readers" #define SC_IFD_SAM_TYPE "GemCore Based Readers - SAM" /*------------------------------------------------------------------------------ Constant section: - IFD_FIRMWARE_VERSION defines the version of the firmware supported by the driver. - IFD_VERSION_MAJOR defines the major version of the firmware supported by the driver. - MAX_IFD_BY_READER defines the maximal number of IFD which can be availables in a reader. ------------------------------------------------------------------------------*/ #define IFD_FIRMWARE_VERSION "GemCore-R1." #define IFD_VERSION_MAJOR 1 #define MAX_IFD_BY_READER 9 /*------------------------------------------------------------------------------ - REG_KEY_MAXIMAL_BAUD_RATE defines the key name in the registry which contains the value of the maximal baud rate for the reader. - IFD_STANDARD_BAUD_RATE defines the standard baud rate for the reader (9600) ------------------------------------------------------------------------------*/ #define REG_KEY_MAXIMAL_BAUD_RATE "MaximalBaudRate" #define IFD_STANDARD_BAUD_RATE 9600 #define REG_KEY_MAXIMAL_IFD "MaximalIFD" #define REG_KEY_IFD_OPTION "IFDOption" /*------------------------------------------------------------------------------ - ICC_DEFAULT_POWER_TIMOUT defines the default power timout in ms (1000). ------------------------------------------------------------------------------*/ #define ICC_DEFAULT_POWER_TIMOUT 1000 /*------------------------------------------------------------------------------ - SCARD_CLASS is a macro to know the class of a Tag. - SCARD_ATTR_SPEC_MIN, SCARD_ATTR_SPEC_MAXI defines the limits of the tags for the vendor. - SCARD_ATTR_SPEC_BAUD_RATE is the Tag for the speed in use between the system and the reader. ------------------------------------------------------------------------------*/ #define SCARD_CLASS(Value) (ULONG) (((ULONG)(Value)) >> 16) #define SCARD_ATTR_SPEC_MINI SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0180) #define SCARD_ATTR_SPEC_MAXI SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x01F0) /*------------------------------------------------------------------------------ - IOCTL_SMARTCARD_IFD_EXCHANGE defines a specific IOCTL for the Gemplus Reader to exchange data with the reader without control of the driver. ------------------------------------------------------------------------------*/ #define IOCTL_SMARTCARD_IFD_EXCHANGE SCARD_CTL_CODE(0x20000000) /*------------------------------------------------------------------------------ - SCARD_ATTR_SPEC_IFD_NUMBER is the Tag for the numero of the sub IFD (or SAM) in the reader. - SCARD_ATTR_SPEC_CMD_TIMEOUT is the Tag for the value of the Cmd Timeout. - SCARD_ATTR_SPEC_POWER_TIMEOUT is the Tag for the value of the Power Timeout. ------------------------------------------------------------------------------*/ #define SCARD_ATTR_SPEC_BAUD_RATE SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0180) #define SCARD_ATTR_SPEC_IFD_NUMBER SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0181) #define SCARD_ATTR_SPEC_CMD_TIMEOUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0182) #define SCARD_ATTR_SPEC_POWER_TIMEOUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0183) #define SCARD_ATTR_SPEC_ICC_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0184) #define SCARD_ATTR_SPEC_IFD_OPTION SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0185) #define SCARD_ATTR_SPEC_MAXIMAL_IFD SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0186) #define SCARD_ATTR_SPEC_APDU_TIMEOUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0187) /*------------------------------------------------------------------------------ - SC_IFD_GEMCORE_DEFAULT_CLK_FREQUENCY defines the default frequency for a GEMCORE reader. - SC_IFD_GEMCORE_MAXIMUM_CLK_FREQUENCY defines the maximum frequency for a GEMCORE reader. - SC_IFD_GEMCORE_DEFAULT_DATA_RATE defines the default baud rate for a GEMCORE reader. - SC_IFD_GEMCORE_MAXIMUM_DATA_RATE defines the maximum baud rate for a GEMCORE reader. - SC_IFD_GEMCORE_MAXIMUM_IFSD defines the maximum IFSD supported by a GEMCORE reader. - SC_IFD_GEMCORE_T0_MAXIMUM_LEX defines the maximum LEX in T=0 supported by a GEMCORE reader. - SC_IFD_GEMCORE_T0_MAXIMUM_LC defines the maximum LC in T=0 supported by a GEMCORE reader. - SC_IFD_GEMCORE_T1_MAXIMUM_LEX defines the maximum LEX in T=1 supported by a GEMCORE reader. - SC_IFD_GEMCORE_T1_MAXIMUM_LC defines the maximum LC in T=1 supported by a GEMCORE reader. ------------------------------------------------------------------------------*/ #define SC_IFD_GEMCORE_DEFAULT_CLK_FREQUENCY 3686 #define SC_IFD_GEMCORE_MAXIMUM_CLK_FREQUENCY 3686 #define SC_IFD_GEMCORE_DEFAULT_DATA_RATE 9909 #define SC_IFD_GEMCORE_MAXIMUM_DATA_RATE 158554 #define SC_IFD_GEMCORE_MAXIMUM_IFSD 254 #define SC_IFD_GEMCORE_T0_MAXIMUM_LEX 256 #define SC_IFD_GEMCORE_T0_MAXIMUM_LC 255 #define SC_IFD_GEMCORE_T1_MAXIMUM_LEX 256 #define SC_IFD_GEMCORE_T1_MAXIMUM_LC 255 /*------------------------------------------------------------------------------ Reader options: - No IFD option (SC_IFD_OPTION_UNDEFINED), - IFD with a keyboard (SC_IFD_OPTION_KEYBOARD), - IFD with a display (SC_IFD_OPTION_DISPLAY), - IFD with a buzzer (SC_IFD_OPTION_BUZZER), - IFD with bank of memory (SC_IFD_OPTION_MEMORY), - IFD with a real time clock (SC_IFD_OPTION_RTC). - IFD with one or more security module SC_IFD_OPTION_SAM). ------------------------------------------------------------------------------*/ #define SC_IFD_OPTION_UNDEFINED 0x0000 // There is no IFD option. #define SC_IFD_OPTION_KEYBOARD 0x0001 // IFD with a keyboard. #define SC_IFD_OPTION_DISPLAY 0x0002 // IFD with a display. #define SC_IFD_OPTION_BUZZER 0x0004 // IFD with a buzzer. #define SC_IFD_OPTION_MEMORY 0x0008 // IFD with bank of memory. #define SC_IFD_OPTION_RTC 0x0010 // IFD with a real time clock. #define SC_IFD_OPTION_SAM 0x0020 // IFD with one or more security module. #define UNICODE_SIZE(x) ((x) * sizeof(WCHAR)) /*------------------------------------------------------------------------------ - CARD_STATUS_MODE define an enumeration of mode for function update card. ------------------------------------------------------------------------------*/ typedef enum _CARD_STATUS_MODE { RUN_REQUEST, RUN_IN_PROCESS, STOP_REQUEST, STOP_IN_PROCESS } CARD_STATUS_MODE; /*------------------------------------------------------------------------------ Struct section: - _SERIAL_READER_CONFIG define a struct for the serial configuration: ------------------------------------------------------------------------------*/ typedef struct _SERIAL_READER_CONFIG { // flow control SERIAL_HANDFLOW HandFlow; // special characters SERIAL_CHARS SerialChars; // read/write timeouts SERIAL_TIMEOUTS Timeouts; // Baudrate for reader SERIAL_BAUD_RATE BaudRate; // Stop bits, parity configuration SERIAL_LINE_CONTROL LineControl; // Event serial reader uses to signal insert/removal ULONG WaitMask; } SERIAL_READER_CONFIG, *PSERIAL_READER_CONFIG; /*------------------------------------------------------------------------------ - _READER_EXTENSION define a struct for the reader specific portion of the smart card extension. * Handle holds the serial communication handle; * IFD number in the reader (0 is the main reader, else is the SAM). * ICCType holds the ICC type. * ICCVpp holds the selected VPP value (G_Oros2IccDefineType). * ICCPresence holds the selected presence byte (G_Oros2IccDefineType). * CmdTimeOut holds the timeout for any command expect an APDU command. * APDUTimeOut holds the timeout for an APDU command. * IFDBaudRate holds the baudrate used between IFD and Host. * PowerTimeOut holds the time for the reader to really power off an ICC after the PowerOff command has been sent. * MaximalIFD holds the maximal number of security modules for the reader. * IFDOption holds the options for the reader. ------------------------------------------------------------------------------*/ typedef struct _READER_EXTENSION { INT16 Handle; WORD32 IFDNumber; INT16 ICCType; WORD16 ICCVpp; WORD16 ICCPresence; WORD32 CmdTimeOut; WORD32 APDUTimeOut; WORD32 IFDBaudRate; WORD32 PowerTimeOut; WORD32 MaximalIFD; WORD32 IFDOption; BYTE ICCVcc; BYTE PTSMode; BYTE PTS0; BYTE PTS1; BYTE PTS2; BYTE PTS3; KMUTEX LongAPDUMutex; KMUTEX ExchangeMutex; ULONG SerialIoControlCode; SERIAL_READER_CONFIG SerialConfigData; ULONG EventMask; // DeviceObject pointer to serial port PDEVICE_OBJECT ConnectedSerialPort; // The dos device name of our smart card reader UNICODE_STRING DosDeviceName; KSPIN_LOCK SpinLock; // This FileObject is needed to close the connection to the serial port. PFILE_OBJECT SerialFileObject; struct _CARD_STATUS { PIRP Irp; CARD_STATUS_MODE Mode; HANDLE ThreadHandle; IO_STATUS_BLOCK IoStatus; KDPC Dpc; } CardStatus; } READER_EXTENSION, *PREADER_EXTENSION; /*------------------------------------------------------------------------------ Prototype section ------------------------------------------------------------------------------*/ NTSTATUS GDDK_09ReaderPower ( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS GDDK_09SetProtocol ( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS GDDK_09Transmit ( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS GDDK_09CardTracking ( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS GDDK_09SpecificIOCTL ( PSMARTCARD_EXTENSION SmartcardExtension, DWORD IoControlCode, DWORD BufferInLen, BYTE *BufferIn, DWORD BufferOutLen, BYTE *BufferOut, DWORD *LengthOut ); NTSTATUS GDDK_09SpecificTag ( PSMARTCARD_EXTENSION SmartcardExtension, DWORD IoControlCode, DWORD BufferInLen, BYTE *BufferIn, DWORD BufferOutLen, BYTE *BufferOut, DWORD *LengthOut ); void GDDK_09UpdateCardStatus ( PSMARTCARD_EXTENSION SmartcardExtension ); void GDDK_09LockExchange ( PSMARTCARD_EXTENSION SmartcardExtension ); void GDDK_09UnlockExchange ( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS GDDK_09OpenChannel ( PSMARTCARD_EXTENSION SmartcardExtension, CONST WORD32 DeviceNumber, CONST WORD32 PortSerialNumber, CONST WORD32 IFDNumber, CONST WORD32 MaximalBaudRate ); NTSTATUS GDDK_09CloseChannel ( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS GDDK_09OpenSession ( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS GDDK_09SwitchSession ( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS GDDK_09CloseSession ( PSMARTCARD_EXTENSION SmartcardExtension ); #endif