windows-nt/Source/XPSP1/NT/drivers/smartcrd/gcr410/gioctl09.h
2020-09-26 16:20:57 +08:00

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