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

276 lines
8.6 KiB
C

/*++
Copyright (c) 1998 Gemplus Development
Name:
GNTSCR.H (Gemplus NT Smart Card Reader definition)
Description :
Holds the common definitions for a smart card reader
This file is a dedicated to a GemCore Pnp reader
Revision History :
dd/mm/yy
13/03/98: V1.00.001 (GPZ)
- Start of development.
--*/
#ifndef _GNTSCR_
#define _GNTSCR_
#define SMARTCARD_POOL_TAG 'bGCS'
#include <ntddk.h>
#include <ntddser.h>
#include <smclib.h>
#include "gemlog.h"
#include "gemcore.h"
#include "gioctl0A.h"
//
// Constant section:
// - SC_DRIVER_NAME defines the name of the Smart Card reader driver.
// - SC_VENDOR_NAME defines the name of the Smart Card reader vendor.
// - SC_IFD_TYPE defines the type of the Smart Card reader.
//
#define SC_DRIVER_NAME "GCR410P"
#define SC_VENDOR_NAME "GEMPLUS"
#define SC_IFD_TYPE "GCR410P"
//
// - IFD_FIRMWARE_VERSION defines the version of the firmware supported
// by the driver.
// - IFD_VERSION_MAJOR and IFD_VERSION_MINOR defines the major and minor
// version of the firmware supported by the driver.
//
#define IFD_FIRMWARE_VERSION "GemCore-R"
#define IFD_VERSION_MAJOR 1
#define IFD_VERSION_MINOR 113
//
// - 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 (38400)
//
#define REG_KEY_MAXIMAL_BAUD_RATE "MaximalBaudRate"
#define IFD_STANDARD_BAUD_RATE 38400
//
// - ICC_DEFAULT_POWER_TIMOUT defines the default power timout in ms (0).
//
#define ICC_DEFAULT_POWER_TIMOUT 0
//
// - SCARD_CLASS is a macro to know the class of a Tag.
//
#define SCARD_CLASS(Value) (ULONG) (((ULONG)(Value)) >> 16)
//
// - IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE defines a specific IOCTL for the Gemplus
// Reader to exchange data with the reader without control of the driver.
// - IOCTL_SMARTCARD_VENDOR_GET_ATTRIBUTE defines a specific IOCTL for the Gemplus
// Reader to gets vendor attributes.
// - IOCTL_SMARTCARD_VENDOR_SET_ATTRIBUTE defines a specific IOCTL for the Gemplus
// Reader to sets vendor attributes.
//
#define IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE CTL_CODE(FILE_DEVICE_SMARTCARD,2048,0,0)
#define IOCTL_SMARTCARD_VENDOR_GET_ATTRIBUTE CTL_CODE(FILE_DEVICE_SMARTCARD,2049,0,0)
#define IOCTL_SMARTCARD_VENDOR_SET_ATTRIBUTE CTL_CODE(FILE_DEVICE_SMARTCARD,2050,0,0)
//
// - SCARD_ATTR_SPEC_BAUD_RATE is the Tag to acces at the value of the baud rate (PC/IFD).
// - SCARD_ATTR_SPEC_CMD_TIMEOUT is the Tag to access at the value of the Cmd Timeout.
// - SCARD_ATTR_SPEC_POWER_TIMEOUT is the Tag to access at the value of the Power
// Timeout.
// - SCARD_ATTR_SPEC_APDU_TIMEOUT is the Tag to access at the value of the APDU
// Timeout.
//
#define SCARD_ATTR_SPEC_BAUD_RATE SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0180)
#define SCARD_ATTR_SPEC_CMD_TIMEOUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0181)
#define SCARD_ATTR_SPEC_POWER_TIMEOUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0182)
#define SCARD_ATTR_SPEC_APDU_TIMEOUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0183)
//
// - SC_IFD_DEFAULT_CLK_FREQUENCY defines the default frequency for the reader.
// - SC_IFD_MAXIMUM_CLK_FREQUENCY defines the maximum frequency for the reader.
// - SC_IFD_DEFAULT_DATA_RATE defines the default baud rate for the reader.
// - SC_IFD_MAXIMUM_DATA_RATE defines the maximum baud rate for the reader.
// - SC_IFD_MAXIMUM_IFSD defines the maximum IFSD supported by the reader.
// - SC_IFD_T0_MAXIMUM_LEX defines the maximum LEX in T=0 supported by the reader.
// - SC_IFD_T0_MAXIMUM_LC defines the maximum LC in T=0 supported by the reader.
//
#define SC_IFD_DEFAULT_CLK_FREQUENCY 3686
#define SC_IFD_MAXIMUM_CLK_FREQUENCY 3686
#define SC_IFD_DEFAULT_DATA_RATE 9909
#define SC_IFD_MAXIMUM_DATA_RATE 158554
#define SC_IFD_MAXIMUM_IFSD 254
#define SC_IFD_T0_MAXIMUM_LEX 256
#define SC_IFD_T0_MAXIMUM_LC 255
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;
//
// Struct section:
// - _DEVICE_EXTENSION define a struct for the device extension:
//
typedef struct _DEVICE_EXTENSION {
// Our smart card extension
SMARTCARD_EXTENSION SmartcardExtension;
// The current number of io-requests
LONG IoCount;
// Used to signal that the reader is able to process requests
KEVENT ReaderStarted;
// Used to signal the the reader has been closed
LONG ReaderOpen;
// Used to signal that the connection to the serial driver has been closed
KEVENT SerialCloseDone;
// Used to signal that the card status thread is scheduled
KEVENT CardStatusNotInUse;
// The pnp device name of our smart card reader
UNICODE_STRING PnPDeviceName;
// Used to keep track of the current power state the reader is in
LONG PowerState;
KSPIN_LOCK SpinLock;
// A worker thread that closes the serial driver
PIO_WORKITEM CloseSerial;
// A worker thread that closes the serial driver
PIO_WORKITEM CardStateChange;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//
// - _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 SerialWaitMask;
} 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;
// * 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.
// * MaximalBaudRate defines the maximal baud rate for the reader.
//
typedef struct _READER_EXTENSION {
short Handle;
ULONG CmdTimeOut;
ULONG APDUTimeOut;
ULONG IFDBaudRate;
ULONG PowerTimeOut;
ULONG MaximalBaudRate;
struct _ICC_CONFIG {
short ICCType;
USHORT ICCVpp;
USHORT ICCPresence;
BYTE ICCVcc;
BYTE PTSMode;
BYTE PTS0;
BYTE PTS1;
BYTE PTS2;
BYTE PTS3;
} IccConfig;
struct _TRANSPARENT_CONFIG {
BYTE CFG;
BYTE ETU;
BYTE EGT;
BYTE CWT;
BYTE BWI;
BYTE Fi;
BYTE Di;
} TransparentConfig;
KMUTEX LongAPDUMutex;
KMUTEX ExchangeMutex;
ULONG SerialIoControlCode;
SERIAL_READER_CONFIG SerialConfigData;
PIRP SerialStatusIrp;
// DeviceObject pointer to serial port
PDEVICE_OBJECT AttachedDeviceObject;
// Flag that indicates that the caller requests a power-down or a reset
BOOLEAN PowerRequest;
// Current reader power state.
READER_POWER_STATE ReaderPowerState;
// Saved card state for hibernation/sleeping modes.
BOOLEAN CardPresent;
// Flag that indicates we're getting the ModemStatus (used in a DPC)
BOOLEAN GetModemStatus;
// Variable used to receive the modem status
ULONG ModemStatus;
} READER_EXTENSION, *PREADER_EXTENSION;
#define READER_EXTENSION(member) (SmartcardExtension->ReaderExtension->member)
#define ATTACHED_DEVICE_OBJECT deviceExtension->SmartcardExtension.ReaderExtension->AttachedDeviceObject
//ISV
/*
#undef SmartcardDebug
#define SmartcardDebug(LEVEL, STRING) {DbgPrint STRING;}
*/
#endif