📄 uscr.h
字号:
/*++Copyright (c) 2004 QWY MicroSystem Inc.Module Name: uscr.hAbstract: USB SmartCard Reader driver for CCID/lsCCID compatible device.Environment: kernel mode onlyNotes:Revision History: 4/24/2005: Adapted from BULKUSB DDK sample.--*/
#ifndef USCRH_INCD
#define USCRH_INCD
//#include "wdm.h"
#include "ntddk.h"
#include "stdarg.h"
#include "stdio.h"
#include "usbdi.h"
#include "usbdlib.h"
#define DRIVER_NAME "QWY USReader"
#define SMARTCARD_POOL_TAG 'QWY'
#include "smclib.h"
#include "uscrdbg.h"
#include "ccid.h"
#include "lsccid.h"
#define IOCTL_USCR_GET_CONFIG_DESCRIPTOR SCARD_CTL_CODE( 0x800 )
#define IOCTL_USCR_RESET_DEVICE SCARD_CTL_CODE( 0x801 )
#define IOCTL_USCR_RESET_PIPE SCARD_CTL_CODE( 0x802 )
#define IOCTL_USCR_CCID SCARD_CTL_CODE( 0x803 )
#define IOCTL_USCR_DecrementIoCount SCARD_CTL_CODE( 0x805 )
#define IOCTL_USCR_IncrementIoCount SCARD_CTL_CODE( 0x806 )
#define IOCTL_USCR_SetPendingIoEvent SCARD_CTL_CODE( 0x807 )
#define IOCTL_USCR_ClearPendingIoEvent SCARD_CTL_CODE( 0x808 )
#define IOCTL_USCR_ReadPendingIoEventState SCARD_CTL_CODE( 0x809 )
#define USCR_MAX_TRANSFER_SIZE 256
#define USB_REQUEST_TIMEOUT 20/*s*/*1000*1000*10 //in units of 100 nanoseconds
// need for SmartcardExtension
typedef struct _READER_EXTENSION {
PDEVICE_OBJECT deviceObject;
UCHAR bSeq;
PIO_WORKITEM CardStatusPollingWorker;
UCHAR channel;/* 0 for default, 1 for builtin functions, other are undefined now.*/} READER_EXTENSION, *PREADER_EXTENSION;
//
// A structure representing the instance information associated with
// this particular device.
//
typedef struct _DEVICE_EXTENSION {
SMARTCARD_EXTENSION SmartcardExtension;
//used to track information on file in use;
LONG bFileOpened;
// Device object we call when submitting Urbs
PDEVICE_OBJECT TopOfStackDeviceObject;
// The bus driver object
PDEVICE_OBJECT PhysicalDeviceObject;
DEVICE_POWER_STATE CurrentDevicePowerState;
// USB configuration handle and ptr for the configuration the
// device is currently in
USBD_CONFIGURATION_HANDLE UsbConfigurationHandle;
PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor;
// ptr to the USB device descriptor
// for this device
PUSB_DEVICE_DESCRIPTOR UsbDeviceDescriptor;
// we support one interface
// this is a copy of the info structure
// returned from select_configuration or
// select_interface
PUSBD_INTERFACE_INFORMATION UsbInterface;
//Bus drivers set the appropriate values in this structure in response
//to an IRP_MN_QUERY_CAPABILITIES IRP. Function and filter drivers might
//alter the capabilities set by the bus driver.
DEVICE_CAPABILITIES DeviceCapabilities;
// used to save the currently-being-handled system-requested power irp request
PIRP PowerIrp;
// set when PendingIoCount goes to 0; flags device can be removed
KEVENT RemoveEvent;
// set when PendingIoCount goes to 1 ( 1st increment was on add device )
// this indicates no IO requests outstanding, either user, system, or self-staged
KEVENT NoPendingIoEvent;
// set to signal driver-generated power request is finished
KEVENT SelfRequestedPowerIrpEvent;
// spinlock used to protect inc/dec iocount logic
KSPIN_LOCK IoCountSpinLock;
// incremented when device is added and any IO request is received;
// decremented when any io request is completed or passed on, and when device is removed
ULONG PendingIoCount;
// count of open pipes
ULONG OpenPipeCount;
// Name buffer for our named Functional device object link
// The name is generated based on the driver's class GUID
WCHAR DeviceLinkNameBuffer[ MAXIMUM_FILENAME_LENGTH ]; // MAXIMUM_FILENAME_LENGTH defined in wdm.h
//flag set when processing IRP_MN_REMOVE_DEVICE
BOOLEAN DeviceRemoved;
// flag set when driver has answered success to IRP_MN_QUERY_REMOVE_DEVICE
BOOLEAN RemoveDeviceRequested;
// flag set when driver has answered success to IRP_MN_QUERY_STOP_DEVICE
BOOLEAN StopDeviceRequested;
// flag set when device has been successfully started
BOOLEAN DeviceStarted;
// flag set when IRP_MN_WAIT_WAKE is received and we're in a power state
// where we can signal a wait
BOOLEAN EnabledForWakeup;
// used to flag that we're currently handling a self-generated power request
BOOLEAN SelfPowerIrp;
// default power state to power down to on self-suspend
ULONG PowerDownLevel;
// default maximum transfer per staged irp size
ULONG MaximumTransferSize;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// function prototypes
NTSTATUS
USCR_ProcessPnPIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USCR_ProcessSysControlIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
USCR_Unload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
USCR_StartDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USCR_StopDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USCR_RemoveDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USCR_CallUSBD(
IN PDEVICE_OBJECT DeviceObject,
IN PURB Urb
);
NTSTATUS
USCR_PnPAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
);
NTSTATUS
USCR_CreateDeviceObject(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PDEVICE_OBJECT *DeviceObject
);
NTSTATUS
USCR_ConfigureDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USCR_IrpCompletionRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
USCR_PoRequestCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE PowerState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus
);
NTSTATUS
USCR_PoSelfRequestCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE PowerState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus
);
NTSTATUS
USCR_GetPortStatus(
IN PDEVICE_OBJECT DeviceObject,
IN PULONG PortStatus
);
NTSTATUS
USCR_ResetParentPort(
IN IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USCR_SelfRequestPowerIrp(
IN PDEVICE_OBJECT DeviceObject,
IN POWER_STATE PowerState
);
BOOLEAN
USCR_SetDevicePowerState(
IN PDEVICE_OBJECT DeviceObject,
IN DEVICE_POWER_STATE DeviceState
);
NTSTATUS
USCR_PowerIrp_Complete(
IN PDEVICE_OBJECT NullDeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
USCR_QueryCapabilities(
IN PDEVICE_OBJECT PdoDeviceObject,
IN PDEVICE_CAPABILITIES DeviceCapabilities
);
NTSTATUS
USCR_Create(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USCR_AbortPipes(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USCR_ProcessIOCTL(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USCRVendorIoctl(
PSMARTCARD_EXTENSION SmartcardExtension
);
NTSTATUS
USCR_SelectInterface(
IN PDEVICE_OBJECT DeviceObject,
IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
);
NTSTATUS
USCR_ResetDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USCR_Close(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USCR_ResetPipe(
IN PDEVICE_OBJECT DeviceObject,
IN PUSBD_PIPE_INFORMATION PipeInfo
);
VOID
USCR_IncrementIoCount(
IN PDEVICE_OBJECT DeviceObject
);
LONG
USCR_DecrementIoCount(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USCR_ProcessPowerIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USCR_SelfSuspendOrActivate(
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN fSuspend
);
NTSTATUS
USCR_SymbolicLink(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PUNICODE_STRING deviceLinkUnicodeString
);
BOOLEAN
USCR_CanAcceptIoRequests(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USCR_USBIoctl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USCR_Cleanup(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USCRStartCardTracking(
IN PDEVICE_OBJECT DeviceObject
);
void
USCRStopCardTracking(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
UsbDoInterruptOrBulkTransfer(
IN PDEVICE_OBJECT DeviceObject,
IN USBD_PIPE_HANDLE PipeHandle,
IN ULONG TransferFlags,
IN PVOID UserBuffer,
ULONG *UserBufferSize
);
NTSTATUS
UsbDoControlTransfer(
IN PDEVICE_OBJECT DeviceObject,
IN PSETUP_PACKET SetupPacket,
IN ULONG TransferFlags,
IN PVOID UserBuffer,
ULONG *UserBufferSize
);
NTSTATUS
InitializeSmartcardExtension(
IN PDEVICE_OBJECT DeviceObject
);
void
DeInitializeSmartcardExtension(
IN PDEVICE_OBJECT DeviceObject
);
#endif // already included
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -