/*++ Copyright (c) 1997 - 1999 SCM Microsystems, Inc. Module Name: PscrNT.h Abstract: Driver header - NT Version Author: Andreas Straub (SCM Microsystems, Inc.) Klaus Schuetz (Microsoft Corp.) Revision History: Andreas Straub 1.00 8/18/1997 Initial Version Klaus Schuetz 1.01 9/20/1997 Timing changed Andreas Straub 1.02 9/24/1997 Low Level error handling, minor bugfixes, clanup Andreas Straub 1.03 10/8/1997 Timing changed, generic SCM interface changed Andreas Straub 1.04 10/18/1997 Interrupt handling changed Andreas Straub 1.05 10/19/1997 Generic IOCTL's added Andreas Straub 1.06 10/25/1997 Timeout limit for FW update variable Andreas Straub 1.07 11/7/1997 Version information added Andreas Straub 1.08 11/10/1997 Generic IOCTL GET_CONFIGURATION Klaus Schuetz 1998 PnP and Power Management added --*/ #if !defined ( __PSCR_NT_DRV_H__ ) #define __PSCR_NT_DRV_H__ #define SMARTCARD_POOL_TAG '4SCS' #include #include #include "SMCLIB.h" #include "WINSMCRD.h" #include "PscrRdWr.h" #if !defined( STATUS_DEVICE_REMOVED ) #define STATUS_DEVICE_REMOVED STATUS_UNSUCCESSFUL #endif #define SysCompareMemory( p1, p2, Len ) ( RtlCompareMemory( p1,p2, Len ) != Len ) #define SysCopyMemory( pDest, pSrc, Len ) RtlCopyMemory( pDest, pSrc, Len ) #define SysFillMemory( pDest, Value, Len ) RtlFillMemory( pDest, Len, Value ) #define DELAY_WRITE_PSCR_REG 1 #define DELAY_PSCR_WAIT 5 #define LOBYTE( any ) ((UCHAR)( any & 0xFF ) ) #define HIBYTE( any ) ((UCHAR)( ( any >> 8) & 0xFF )) typedef struct _DEVICE_EXTENSION { SMARTCARD_EXTENSION SmartcardExtension; // The PDO that we are attached to PDEVICE_OBJECT AttachedPDO; // The DPC object for post interrupt processing KDPC DpcObject; // Out interrupt resource PKINTERRUPT InterruptObject; // Flag that indicates if we need to unmap the port upon stop BOOLEAN UnMapPort; // Our PnP device name UNICODE_STRING DeviceName; // Current number of io-requests LONG IoCount; // Used to access IoCount; KSPIN_LOCK SpinLock; // Used to signal that the device has been removed KEVENT ReaderRemoved; // Used to signal that the reader is able to process reqeusts KEVENT ReaderStarted; // Used to signal the the reader has been closed LONG ReaderOpen; // Used to keep track of the current power state the reader is in LONG PowerState; // Number of pending card tracking interrupts ULONG PendingInterrupts; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; #define PSCR_MAX_DEVICE 2 #define IOCTL_PSCR_COMMAND SCARD_CTL_CODE( 0x8000 ) #define IOCTL_GET_VERSIONS SCARD_CTL_CODE( 0x8001 ) #define IOCTL_SET_TIMEOUT SCARD_CTL_CODE( 0x8002 ) #define IOCTL_GET_CONFIGURATION SCARD_CTL_CODE( 0x8003 ) typedef struct _VERSION_CONTROL { ULONG SmclibVersion; UCHAR DriverMajor, DriverMinor, FirmwareMajor, FirmwareMinor, UpdateKey; } VERSION_CONTROL, *PVERSION_CONTROL; #define SIZEOF_VERSION_CONTROL sizeof( VERSION_CONTROL ) typedef struct _PSCR_CONFIGURATION { PPSCR_REGISTERS IOBase; ULONG IRQ; } PSCR_CONFIGURATION, *PPSCR_CONFIGURATION; #define SIZEOF_PSCR_CONFIGURATION sizeof( PSCR_CONFIGURATION ) void SysDelay( ULONG Timeout ); BOOLEAN PscrMapIOPort( INTERFACE_TYPE InterfaceType, ULONG BusNumber, PHYSICAL_ADDRESS BusAddress, ULONG Length, PULONG pIOPort ); NTSTATUS DriverEntry( PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath ); NTSTATUS PscrPnP( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PscrPower( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PscrCreateAndStartDevice( PDRIVER_OBJECT DriverObject ); NTSTATUS PscrCreateDevice( IN PDRIVER_OBJECT DriverObject, OUT PDEVICE_OBJECT *DeviceObject ); NTSTATUS PscrStartDevice( PDEVICE_OBJECT DeviceObject, PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDescriptor ); NTSTATUS PscrPcmciaCallComplete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT Event ); VOID PscrStopDevice( PDEVICE_OBJECT DeviceObject ); NTSTATUS PscrReportResources( PDRIVER_OBJECT DriverObject, PCM_FULL_RESOURCE_DESCRIPTOR FullResourceDesciptor ); NTSTATUS PscrAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ); VOID PscrUnloadDevice( PDEVICE_OBJECT DeviceObject ); VOID PscrUnloadDriver( PDRIVER_OBJECT DriverObject ); BOOLEAN IsPnPDriver( void ); VOID PscrFinishPendingRequest( PDEVICE_OBJECT DeviceObject, NTSTATUS NTStatus ); NTSTATUS PscrCancel( PDEVICE_OBJECT DeviceObject, PIRP Irp ); NTSTATUS PscrCleanup( PDEVICE_OBJECT DeviceObject, PIRP Irp ); BOOLEAN PscrIrqServiceRoutine( PKINTERRUPT Interrupt, PDEVICE_EXTENSION DeviceExtension ); VOID PscrDpcRoutine( PKDPC Dpc, PDEVICE_OBJECT DeviceObject, PDEVICE_EXTENSION DeviceExtension, PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS PscrGenericIOCTL( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS PscrCreateClose( PDEVICE_OBJECT DeviceObject, PIRP Irp ); NTSTATUS PscrSystemControl( PDEVICE_OBJECT DeviceObject, PIRP Irp ); NTSTATUS PscrDeviceIoControl( PDEVICE_OBJECT DeviceObject, PIRP Irp ); VOID PscrInterruptEvent( IN PDEVICE_OBJECT DeviceObject ); VOID PscrFreeze( PSMARTCARD_EXTENSION SmartcardExtension ); NTSTATUS PscrCallPcmciaDriver( IN PDEVICE_OBJECT AttachedPDO, IN PIRP Irp ); #endif // __PSCR_NT_DRV_H__