Windows2003-3790/drivers/smartcrd/sccmn50m/sccmn50m.h
2020-09-30 16:53:55 +02:00

805 lines
21 KiB
C

/*****************************************************************************
* $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 <ntddk.h>
#include <ntddser.h>
#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.
*
*
*****************************************************************************/