|
|
/*++
Module Name:
L220SCR.h
Abstract:
smartcard 220 serial miniport defines and structures
Revision History:
--*/
#ifndef _L220SCR_
#define _L220SCR_
#define DRIVER_NAME "LIT220P"
#ifndef _WDMDDK_
#include <ntddk.h>
#endif
#include <ntddser.h>
// Pool tag for Litronic xlCS where x is a number we choose
#define SMARTCARD_POOL_TAG '0lCS'
#include "smclib.h"
#include "L220log.h"
#define IOCTL_SMARTCARD_220_READ SCARD_CTL_CODE( 8)
#define IOCTL_SMARTCARD_220_WRITE SCARD_CTL_CODE( 9)
#define MAX_IFSD 254
//
// 220 smart card reader command constants
//
#define LIT220_READER_ATTENTION 0xF4
#define KBD_ACK 0xFA
#define LIT220_GET_READER_TYPE 0xB0
#define LIT220_SET_MODE 0xB1
#define LIT220_CARD_POWER_ON 0xB2
#define LIT220_CARD_POWER_OFF 0xB3
#define LIT220_RESET 0xB4
#define LIT220_GET_READER_STATUS 0xB5
#define LIT220_SEND_BYTE 0xB6
#define LIT220_SEND_BLOCK 0xB7
#define LIT220_RESEND_BLOCK 0xB8
#define LIT220_GET_READER_CAPS 0xB9
#define LIT220_DEACTIVATE_READER 0xBA
//
// 220 smart card respons bytes
// every received packet starts with one of these bytes
//
#define LIT220_READER_TYPE 0x60
#define LIT220_READER_STATUS 0x61
#define LIT220_ACK 0x62
#define LIT220_RECEIVE_BYTE 0x63
#define LIT220_RECEIVE_BLOCK 0x64
#define LIT220_CARD_IN 0x65
#define LIT220_CARD_OUT 0x66
#define LIT220_NACK 0x67
//
// Length of constant size reply packets
//
#define LIT220_READER_TYPE_LEN 16
#define LIT220_READER_STATUS_LEN 4
//
// Length of constant command packets
//
#define LIT220_READER_SET_MODE_LEN 8
//
// Reader status flags
//
#define LIT220_STATUS_CARD_INSERTED 0x08
#define LIT220_VENDOR_NAME "Litronic"
#define LIT220_PRODUCT_NAME "220 Smartcard Reader"
//
// WaitMask values
//
#define WAIT_DATA 0x0001
#define WAIT_ACK 0x0002
#define WAIT_INSERTION 0x0004
#define WAIT_REMOVAL 0x0008
//
// 220 smart card reader dependent flags
//
#define LIT220_READER_PROTOCOL_T1 0x10
#define LIT220_READER_CONVENTION_INVERSE 0x02
#define LIT220_READER_CHECK_CRC 0x01
#define LIT220_READER_BWT_EXTENSION 0x04
// Set mode flags
#define SETMODE_PROTOCOL 0x01
#define SETMODE_GT 0x02
#define SETMODE_WI 0x04
#define SETMODE_BWI 0x08
#define SETMODE_WTX 0x10
#define SETMODE_FI_DI 0x20
#define UNICODE_SIZE(x) ((x) * sizeof(WCHAR))
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;
//
// Event serial reader uses to signal insert/removal
//
ULONG WaitMask;
} SERIAL_READER_CONFIG, *PSERIAL_READER_CONFIG;
//
// Define the reader specific portion of the smart card extension
//
typedef struct _READER_EXTENSION {
//
// DeviceObject pointer to serial port
//
PDEVICE_OBJECT ConnectedSerialPort;
//
// This struct is used for CardTracking
//
struct {
PIRP Irp;
KEVENT Event;
IO_STATUS_BLOCK IoStatus;
KDPC Dpc;
} CardStatus;
//
// This struct is used to get the number of characters in the input queue
//
SERIAL_STATUS SerialStatus;
//
// IOCTL to send to the serial driver
//
ULONG SerialIoControlCode;
//
// This holds state bits for the COM port such as DSR
//
ULONG ModemStatus;
//
// This holds the serial parameters used to configure the serial port
//
SERIAL_READER_CONFIG SerialConfigData;
//
// This is the data byte no in reply packet
//
ULONG DataByteNo;
//
// Number of bytes expected in the reply packer as indicated by byte 2
// and 3 of the receive packet
//
LENGTH DataLength;
//
// Flags that indicate if we have received the length-bytes in the receive packet
//
BOOLEAN GotLengthB0; BOOLEAN GotLengthB1;
//
// Nack received from reader
//
BOOLEAN GotNack;
//
// The total number of bytes currently in the receive packet
//
ULONG ReceivedByteNo;
//
// This flag inidictes that the input filter treats the next packet as and ATR
//
BOOLEAN WaitForATR;
//
// Mask that indicates the input filter what events we are expecting
//
ULONG WaitMask;
//
// Smartcard notification DPC queue
//
KDPC NotificationIsrDpc;
//
// Event used to indicate that an ack was received by the input filter.
// This will signal the Lit220Command that it can continue.
//
KEVENT AckEvnt;
//
// Event used to indicate that a data packet was received by the input filter.
// This will signal the Lit220Command that it can continue.
//
KEVENT DataEvnt;
//
// Holds the Device Object of the top of our stack
//
PDEVICE_OBJECT BusDeviceObject;
//
// Holds the Device Object of our parent (1394 bus driver)
//
PDEVICE_OBJECT PhysicalDeviceObject;
//
// State the Lit220SerialEventCallback is in.
//
DWORD SerialEventState;
//
// Temporary transfer buffer used to get data from the serial port
// before we send it to the input filter
//
BYTE TempXferBuf[270];
// Flag that indicates that the caller requests a power-down or a reset
BOOLEAN PowerRequest;
// Saved card state for hibernation/sleeping modes.
BOOLEAN CardPresent;
// Current reader power state.
READER_POWER_STATE ReaderPowerState;
// Used to indicate that the device has been removed even before we can release
// the remove lock throw SmartcardReleaseRemoveLockAndWait. This way when we
// close the connection to the serial port we won't send any more IRPs to the
// device
BOOLEAN DeviceRemoved;
// Flag indicating whether the card is inserted or not
DWORD CardIn;
} READER_EXTENSION, *PREADER_EXTENSION;
typedef struct _DEVICE_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;
// The pnp device name of our smart card reader
UNICODE_STRING PnPDeviceName;
// 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 keep track of the current power state the reader is in
LONG PowerState;
KSPIN_LOCK SpinLock;
// A worker thread that closes the serial driver &
// handling IO timeouts
PIO_WORKITEM WorkItem;
// Keeps track of how many times the timeout
// function has been called
BYTE EntryCount;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//
// Prototypes
//
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath );
VOID Lit220Unload( IN PDRIVER_OBJECT DriverObject );
NTSTATUS Lit220CreateClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS Lit220SystemControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS Lit220DeviceControl( PDEVICE_OBJECT DeviceObject, PIRP Irp );
NTSTATUS Lit220Initialize( IN PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220ConfigureSerialPort( PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220SerialIo( IN PSMARTCARD_EXTENSION SmartcardExtension );
VOID Lit220StopDevice( IN PSMARTCARD_EXTENSION SmartcardExtension );
VOID Lit220RemoveDevice( IN PDEVICE_OBJECT DeviceObject );
NTSTATUS Lit220StartDevice( IN PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220InitializeInputFilter( PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220Cleanup( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS Lit220Cancel( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
BOOLEAN Lit220InputFilter( IN BYTE SmartcardByte, IN PSMARTCARD_EXTENSION smartcardExtension );
NTSTATUS Lit220CardTracking( PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220SetProtocol( PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220Power( PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220IoRequest( PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220GetReaderError( PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220IoReply( PSMARTCARD_EXTENSION SmartcardExtension );
BOOLEAN Lit220IsCardPresent( IN PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220Command( IN PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220AddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject );
NTSTATUS Lit220PnP( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS Lit220SynchCompletionRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT Event ); VOID Lit220CloseSerialPort( IN PDEVICE_OBJECT DeviceObject, IN PVOID Context );
NTSTATUS Lit220CallSerialDriver( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS Lit220SerialEventCallback( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PSMARTCARD_EXTENSION SmartcardExtension );
NTSTATUS Lit220DispatchPower ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
VOID Lit220NotifyCardChange( IN PSMARTCARD_EXTENSION smartcardExtension, IN DWORD CardInserted );
NTSTATUS Lit220DevicePowerCompletion ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PSMARTCARD_EXTENSION SmartcardExtension );
VOID Lit220CompleteCardTracking( IN PSMARTCARD_EXTENSION SmartcardExtension );
VOID Lit220ReceiveBlockTimeout( IN PDEVICE_OBJECT DeviceObject, IN PVOID Context );
VOID Lit220ProcessNack( PSMARTCARD_EXTENSION SmartcardExtension );
VOID Lit220StartTimer( IN PDEVICE_OBJECT DeviceObject, IN PIO_WORKITEM WorkItem );
VOID Lit220StopTimer( IN PDEVICE_OBJECT DeviceObject, IN PIO_WORKITEM WorkItem );
VOID Lit220ScheduleTimer( IN PSMARTCARD_EXTENSION SmartcardExtension, IN PIO_WORKITEM_ROUTINE Routine );
#endif
|