/***************************************************************************** * $ProjectName: $ * $ProjectRevision: $ *----------------------------------------------------------------------------- * $Source: z:/pr/cmbs0/sw/sccmn50m.ms/rcs/sccmn50m.h $ * $Revision: 1.3 $ *----------------------------------------------------------------------------- * $Author: TBruendl $ *----------------------------------------------------------------------------- * History: see EOF *----------------------------------------------------------------------------- * * Copyright © 2000 OMNIKEY AG ******************************************************************************/ #ifndef _CARDMAN_ #define _CARDMAN_ // **************************************************************************** // DEFINES // **************************************************************************** #define DRIVER_NAME "SCCMN50M" #define SMARTCARD_POOL_TAG 'CMCS' #include #include #include "smclib.h" #include "sccmlog.h" #include "pcsc_cm.h" #define SMARTCARD_READ SCARD_CTL_CODE(1000) #define SMARTCARD_WRITE SCARD_CTL_CODE(1001) #define CARDMAN_DEVICE_NAME L"\\Device\\CM_2010_0" #define IFD_NT_VERSIONMAJOR_CARDMAN 3 #define IFD_NT_VERSIONMINOR_CARDMAN 2 #define IFD_NT_BUILDNUMBER_CARDMAN 1 #define ATTR_VENDOR_NAME "OMNIKEY" #define ATTR_IFD_TYPE_CM "CardMan 2010" #define ATTR_MAX_IFSD_CARDMAN_II 80 #define WAIT_MS -10000 #define ms_ 1 #define UNKNOWN 0xFFFFFFFF #define REMOVED 0x00000001 #define INSERTED 0x00000002 #define POWERED 0x00000004 // SCR control byte #define IGNORE_PARITY 0x01 #define XMIT_HANDSHAKE_OFF 0x02 #define CM2_GET_ATR 0x04 //#define reserved 0x08 #define TO_STATE_XH 0x10 #define LEDS_OFF 0x20 #define LEDS_RED 0x40 #define CARD_POWER 0x80 // card control byte #define INVERSE_DATA 0x01 #define ENABLE_5MHZ_FAST 0x02 #define ENABLE_3MHZ_FAST 0x04 #define ENABLE_5MHZ 0x08 #define ENABLE_3MHZ 0x00 #define ENABLE_SYN 0x10 #define ENABLE_T0 0x20 #define ENABLE_T1 0x40 #define ENABLE_CRC 0x80 #define ALL_FLAGS 0xFF // tx control byte #define SYNC_RESET_LINE_HIGH 0x80 #define SYNC_RESET_LINE_LOW 0x00 #define CLOCK_FORCED_2WBP 0x40 #define TRANSMIT_A8 0x08 #define SYNC_DUMMY_RECEIVE 0x10 // rx control byte #define T0_DATA_TO_CARD 0x80 #define T0_DATA_FROM_CARD 0x00 #define COLD_RESET 0x40 #define RECEIVE_A8 0x08 #define DEFAULT_READ_INTERVAL_TIMEOUT 1000 #define DEFAULT_READ_TOTAL_TIMEOUT_MULTIPLIER 50 #define DEFAULT_READ_TOTAL_TIMEOUT_CONSTANT 1500 #define DEFAULT_WRITE_TOTAL_TIMEOUT_MULTIPLIER 50 #define DEFAULT_WRITE_TOTAL_TIMEOUT_CONSTANT 250 // for protocol T=0 #define T0_HEADER_LEN 0x05 #define T0_STATE_LEN 0x02 // for protocol T=1 #define T1_HEADER_LEN 0x03 #define MAX_EDC_LEN 0x02 // for power on #define RESET_DELAY_SYNC 0x01 #define ASYNC3_CARD 0x00 #define ASYNC5_CARD 0x01 #define ATR_LEN_SYNC 4 #define ATR_LEN_ASYNC 33 #define CHAR_INV 0x03 #define CHAR_NORM 0x3B #define MIN_ATR_LEN 0x03 #define SYNC_ATR_RX_CONTROL 0x47 #define SYNC_RESET_DELAY 0x01 #define TS_OFFSET 0 #define T0_OFFSET 1 typedef enum _READER_POWER_STATE { PowerReaderUnspecified = 0, PowerReaderWorking, PowerReaderOff } READER_POWER_STATE, *PREADER_POWER_STATE; 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; // // current status of the serial port for IOCTL_GET_COMMSTATUS // SERIAL_STATUS SerialStatus; // mask for purge operation ULONG PurgeMask; } SERIAL_READER_CONFIG, *PSERIAL_READER_CONFIG; typedef struct _CARDMAN_CONFIG { UCHAR SCRControl; UCHAR CardControl; UCHAR CardStopBits; UCHAR ResetDelay; } CARDMAN_CONFIG, *PCARDMAN_CONFIG; typedef struct _CARDMAN_HEADER { UCHAR TxControl; UCHAR TxLength; UCHAR RxControl; UCHAR RxLength; } CARDMAN_HEADER, *PCARDMAN_HEADER; 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 reqeusts KEVENT ReaderStarted; // Used to signal the the reader has been closed KEVENT ReaderClosed; // Used to signal that the connection to the serial driver has been closed KEVENT SerialCloseDone; ULONG DeviceInstance; // The pnp device name of our smart card reader UNICODE_STRING PnPDeviceName; KSPIN_LOCK SpinLock; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; // // Define the reader specific portion of the smart card extension // typedef struct _READER_EXTENSION { HANDLE hThread; // DeviceObject pointer to serial port PDEVICE_OBJECT AttachedDeviceObject; // IoRequest to be send to serial driver ULONG SerialIoControlCode; // Saved card state for hibernation/sleeping modes. BOOLEAN CardPresent; // Current reader power state. READER_POWER_STATE ReaderPowerState; BOOLEAN TimeToTerminateThread; PVOID ThreadObjectPointer; KMUTEX CardManIOMutex; SERIAL_READER_CONFIG SerialConfigData; BOOLEAN NoConfig; BOOLEAN ToRHConfig; BOOLEAN BreakSet; ULONG SerialErrors; CARDMAN_CONFIG CardManConfig; CARDMAN_HEADER CardManHeader; ULONG ulOldCardState; ULONG ulNewCardState; BOOLEAN fRawModeNecessary; ULONG ulFWVersion; BOOLEAN fSPESupported; BOOLEAN fTransparentMode; BOOLEAN fInverseAtr; UCHAR abDeviceDescription[42]; SYNC_PARAMETERS SyncParameters; } READER_EXTENSION, *PREADER_EXTENSION; #define READER_EXTENSION(member) (SmartcardExtension->ReaderExtension->member) #define ATTACHED_DEVICE_OBJECT deviceExtension->SmartcardExtension.ReaderExtension->AttachedDeviceObject // **************************************************************************** // PROTOTYPES // **************************************************************************** NTSTATUS SCCMN50M_AddDevice ( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ); NTSTATUS SCCMN50M_CallSerialDriver ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCCMN50M_Cancel ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCCMN50M_Cleanup ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID SCCMN50M_ClearCardControlFlags ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN UCHAR Flags ); VOID SCCMN50M_ClearCardManHeader ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); VOID SCCMN50M_ClearSCRControlFlags ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN UCHAR Flags ); VOID SCCMN50M_CompleteCardTracking ( IN PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS SCCMN50M_CreateClose ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCCMN50M_CreateDevice ( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PDEVICE_OBJECT *DeviceObject ); NTSTATUS SCCMN50M_DeviceControl ( PDEVICE_OBJECT DeviceObject, PIRP Irp ); VOID SCCMN50M_DriverUnload ( IN PDRIVER_OBJECT DriverObject ); VOID SCCMN50M_InitializeSmartcardExtension ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN ULONG ulDeviceInstance ); NTSTATUS SCCMN50M_PnP ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCCMN50M_Power ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID SCCMN50M_RemoveDevice ( PDEVICE_OBJECT DeviceObject ); NTSTATUS SCCMN50M_SerialIo ( PSMARTCARD_EXTENSION SmartcardExtension ); VOID SCCMN50M_SetCardManHeader ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN UCHAR TxControl, IN UCHAR TxLength, IN UCHAR RxControl, IN UCHAR RxLength ); VOID SCCMN50M_SetCardControlFlags ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN UCHAR Flags ); VOID SCCMN50M_SetSCRControlFlags ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN UCHAR Flags ); VOID SCCMN50M_StopCardTracking ( IN PDEVICE_EXTENSION pDeviceExtension ); VOID SCCMN50M_SetVendorAndIfdName( IN PDEVICE_OBJECT PhysicalDeviceObject, IN PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS SCCMN50M_SystemControl( PDEVICE_OBJECT DeviceObject, PIRP Irp ); VOID SCCMN50M_UpdateCurrentStateThread ( IN PVOID Context ); NTSTATUS SCCMN50M_UpdateCurrentState( IN PSMARTCARD_EXTENSION smartcardExtension ); NTSTATUS SCCMN50M_VendorIoctl ( PSMARTCARD_EXTENSION SmartcardExtension ); VOID SCCMN50M_CloseSerialDriver( IN PDEVICE_OBJECT DeviceObject ); NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); VOID MemSet(PUCHAR pbBuffer, ULONG ulBufferSize, UCHAR ucPattern, ULONG ulCount); VOID MemCpy(PUCHAR pbDestination, ULONG ulDestinationLen, PUCHAR pbSource, ULONG ulCount); NTSTATUS Wait ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN ULONG ulMilliseconds ); NTSTATUS SCCMN50M_ReadCardMan ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN ULONG ulBytesToRead, OUT PULONG pulBytesRead, IN PUCHAR pbReadBuffer, IN ULONG ulReadBufferSize ); NTSTATUS SCCMN50M_WriteCardMan ( IN PSMARTCARD_EXTENSION SmartcardExtension, ULONG BytesToWrite, PUCHAR pWriteBuffer ); NTSTATUS SCCMN50M_SerialIo( IN PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS SCCMN50M_SetWrite ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN ULONG ulBytesToWrite, IN PUCHAR pbWriteBuffer ); NTSTATUS SCCMN50M_SetRead( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN ULONG ulBytesToRead ); NTSTATUS SCCMN50M_PurgeComm ( IN PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS SCCMN50M_GetCommStatus( IN PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS SCCMN50M_ResyncCardManII ( IN PSMARTCARD_EXTENSION SmartcardExtension ); BOOLEAN SCCMN50M_IOOperationFailed( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_StartCardTracking ( PDEVICE_EXTENSION pDeviceExtension ); NTSTATUS SCCMN50M_InitCommPort ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_GetDeviceDescription ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_InitializeCardMan ( IN PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS SCCMN50M_SetRTS ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_SetDTR ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_TransmitT0 ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_TransmitT1 ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_Transmit ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_EnterTransparentMode ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_ExitTransparentMode ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); VOID SCCMN50M_InverseBuffer ( PUCHAR pbBuffer, ULONG ulBufferSize ); NTSTATUS SCCMN50M_ResyncCardManI ( IN PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS SCCMN50M_SetBRK ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_ClearBRK ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_ClearRTS ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_PowerOff ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_PowerOn ( IN PSMARTCARD_EXTENSION pSmartcardExtension, OUT PULONG pulAtrLength, OUT PUCHAR pbAtrBuffer, IN ULONG ulAtrBufferSize ); NTSTATUS SCCMN50M_CardPower ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_UseParsingStrategy ( IN PSMARTCARD_EXTENSION pSmartcardExtension, OUT PULONG pulAtrLength, OUT PUCHAR pbAtrBuffer, IN ULONG ulAtrBufferSize ); NTSTATUS SCCMN50M_UseColdWarmResetStrategy ( IN PSMARTCARD_EXTENSION pSmartcardExtension, OUT PULONG pulAtrLength, OUT PUCHAR pbAtrBuffer, IN ULONG ulAtrBufferSize, IN BOOLEAN fWarmReset ); BOOLEAN SCCMN50M_IsAtrValid ( PUCHAR pbAtrBuffer, ULONG ulAtrLength ); NTSTATUS SCCMN50M_SetProtocol ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_CardTracking ( PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_IoCtlVendor ( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS SCCMN50M_SetHighSpeed_CR80S_SAMOS ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_GetFWVersion ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_ReadDeviceDescription ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); BOOLEAN SCCMN50M_IsAsynchronousSmartCard ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_SetFl_1Dl_3(IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_SetFl_1Dl_1(IN PSMARTCARD_EXTENSION pSmartcardExtension ); // synchronous smart cards NTSTATUS SCCMN50M_SyncCardPowerOn ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_SetSyncParameters ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); UCHAR SCCMN50M_CalcTxControlByte ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN ULONG ulBitsToWrite ); UCHAR SCCMN50M_CalcTxLengthByte ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN ULONG ulBitsToWrite ); UCHAR SCCMN50M_CalcRxControlByte ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN ULONG ulBitsToRead ); UCHAR SCCMN50M_CalcRxLengthByte ( IN PSMARTCARD_EXTENSION pSmartcardExtension, IN ULONG ulBitsToRead ); NTSTATUS SCCMN50M_ResetCard2WBP ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_Transmit2WBP ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_Transmit3WBP ( IN PSMARTCARD_EXTENSION pSmartcardExtension ); NTSTATUS SCCMN50M_UseSyncStrategy ( IN PSMARTCARD_EXTENSION pSmartcardExtension, OUT PULONG pulAtrLength, OUT PUCHAR pbAtrBuffer, IN ULONG ulAtrBufferSize ); VOID SCCMN50M_Shift_Msg ( PUCHAR pbBuffer, ULONG ulMsgLen ); VOID SCCMN50M_CheckAtrModified ( IN OUT PUCHAR pbBuffer, IN ULONG ulBufferSize ); #endif /***************************************************************************** * History: * $Log: sccmn50m.h $ * Revision 1.3 2000/07/28 09:24:13 TBruendl * Changes for OMNIKEY on Whistler CD * * Revision 1.8 2000/06/28 08:47:33 TBruendl * R03_0_1_1 * * Revision 1.7 2000/06/27 11:56:29 TBruendl * workaraound for SAMOR smart cards with invalid ATR (ITSEC) * * Revision 1.6 2000/05/23 09:58:27 TBruendl * OMNIKEY 3.0.0.1 * * Revision 1.5 2000/03/01 09:32:06 TBruendl * R02.20.0 * * Revision 1.4 1999/12/13 07:57:30 TBruendl * build number increased * * Revision 1.3 1999/07/12 12:50:10 TBruendl * new version information * * Revision 1.2 1999/06/10 09:03:58 TBruendl * No comment given * * Revision 1.1 1999/02/02 13:34:39 TBruendl * This is the first release (R01.00) of the IFD handler for CardMan running under NT5.0. * * *****************************************************************************/