//------------------------------------------------------------------- // This is abstract class for generic device // Specific devices should use it as a parent device // Author: Sergey Ivanov // Log: // 08/11/99 - implemented //------------------------------------------------------------------- #ifndef __SMART_CARD__ #define __SMART_CARD__ #include "generic.h" #include "kernel.h" // // - 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) // 2051 is reserved for Gcr420 keyboard reader. #define IOCTL_SMARTCARD_VENDOR_SWITCH_SPEED CTL_CODE(FILE_DEVICE_SMARTCARD,2052,0,0) // // - SCARD_CLASS is a macro to know the class of a Tag. // #define SCARD_CLASS(Value) (ULONG) (((ULONG)(Value)) >> 16) // // - 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) // // To give possibility for recognition of driver // #define SCARD_ATTR_MANUFACTURER_NAME SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0190) #define SCARD_ATTR_ORIGINAL_FILENAME SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED,0x0191) #define GBCLASS_OPEN_SESSION 0x3001 #define GBCLASS_CLOSE_SESSION 0x3002 #define GBCLASS_DRIVER_SCNAME 0x3003 #define GBCLASS_CONNECTION_TYPE 0x3004 #define IOCTL_OPEN_SESSION CTL_CODE(FILE_DEVICE_BUS_EXTENDER,GBCLASS_OPEN_SESSION,METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_CLOSE_SESSION CTL_CODE(FILE_DEVICE_BUS_EXTENDER,GBCLASS_CLOSE_SESSION,METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_DRIVER_SCNAME CTL_CODE(FILE_DEVICE_BUS_EXTENDER,GBCLASS_DRIVER_SCNAME,METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_GET_CONNECTION_TYPE CTL_CODE(FILE_DEVICE_BUS_EXTENDER,GBCLASS_CONNECTION_TYPE,METHOD_BUFFERED,FILE_ANY_ACCESS) #define ATTR_MANUFACTURER_NAME "Gemplus" #define ATTR_ORIGINAL_FILENAME "GrClass.sys" #define ATTR_LENGTH 32 #define SC_IFD_DEFAULT_CLK_FREQUENCY 4000 #define SC_IFD_MAXIMUM_CLK_FREQUENCY 4000 #define SC_IFD_DEFAULT_DATA_RATE 10753 #define SC_IFD_MAXIMUM_DATA_RATE 125000 #define SC_IFD_MAXIMUM_IFSD 253// To correct problem with SMCLIB! #define SC_IFD_T0_MAXIMUM_LEX 256 #define SC_IFD_T0_MAXIMUM_LC 255 // PTS mode parameters #define PROTOCOL_MODE_DEFAULT 0 #define PROTOCOL_MODE_MANUALLY 1 static ULONG dataRatesSupported[] = { 10753, 14337, 15625, 17204, 20833, 21505, 28674, 31250, 34409, 41667, 43011, 57348, 62500, 83333, 86022, 114695, 125000 }; #define GRCLASS_DRIVER_NAME "GRClass" #define GRCLASS_VENDOR_NAME "Gemplus" #define GRCLASS_READER_TYPE "GemPC430" #define REQUEST_TO_NOTIFY_INSERTION 1 #define REQUEST_TO_NOTIFY_REMOVAL 2 #pragma LOCKEDCODE // Declare Smclib system callbacks... #ifdef __cplusplus extern "C"{ #endif NTSTATUS smartCard_Transmit(PSMARTCARD_EXTENSION SmartcardExtension); NTSTATUS smartCard_CancelTracking(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp); NTSTATUS smartCard_Tracking(PSMARTCARD_EXTENSION SmartcardExtension); NTSTATUS smartCard_VendorIoctl(PSMARTCARD_EXTENSION SmartcardExtension); NTSTATUS smartCard_Power(PSMARTCARD_EXTENSION SmartcardExtension); NTSTATUS smartCard_SetProtocol(PSMARTCARD_EXTENSION SmartcardExtension); #ifdef __cplusplus } #endif #pragma PAGEDCODE class CUSBReader;//TO CHANGE LATER... class CSmartCard { public: NTSTATUS m_Status; SAFE_DESTRUCTORS(); virtual VOID dispose(){self_delete();}; private: CUSBReader* reader; CDebug* debug; CMemory* memory; CLock* lock; CSystem* system; CIrp* irp; KEVENT evCanceled;// set when tracking is canceled... PIRP poolingIrp; UNICODE_STRING DosDeviceName;//Used only at Win9x public: KSPIN_LOCK CardLock; protected: virtual ~CSmartCard(); public: CSmartCard(); virtual CUSBReader* getReader() {return reader;};//TO CHANGE LATER... virtual BOOL smartCardConnect(CUSBReader* reader); virtual VOID smartCardDisconnect(); virtual BOOL smartCardStart(); virtual PKSPIN_LOCK getCardLock(){return &CardLock;}; virtual VOID completeCardTracking(); virtual VOID setPoolingIrp(PIRP Irp){poolingIrp = Irp;}; virtual PIRP getPoolingIrp(){return poolingIrp;}; virtual BOOLEAN CheckSpecificMode(BYTE* ATR, DWORD ATRLength); }; #endif