335 lines
12 KiB
C
335 lines
12 KiB
C
|
/*******************************************************************************
|
||
|
* 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
|