Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

286 lines
6.0 KiB

/*++
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 <wdm.h>
#include <DEVIOCTL.H>
#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__