/*++ Copyright (c) 1997 Microsoft Corporation Module Name: private.h Abstract: Prototypes and definitions for the usb scanner device driver. Author: Environment: kernel mode only Notes: Revision History: --*/ // // Includes // #include "debug.h" // // Defines // #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif #define TAG_USBSCAN 0x55495453 // "STIU" #define TAG_USBD 0x44425355 // "USBD" #define USBSCAN_OBJECTNAME_A "\\\\.\\Usbscan" #define USBSCAN_OBJECTNAME_W L"\\\\.\\Usbscan" #define USBSCAN_REG_CREATEFILE L"CreateFileName" #define USBSCAN_TIMEOUT_READ 120 // 120 sec #define USBSCAN_TIMEOUT_WRITE 120 // 120 sec #define USBSCAN_TIMEOUT_EVENT 0 // no timeout #define USBSCAN_TIMEOUT_OTHER 120 // 120 sec #define USBSCAN_REG_TIMEOUT_READ L"TimeoutRead" #define USBSCAN_REG_TIMEOUT_WRITE L"TimeoutWrite" #define USBSCAN_REG_TIMEOUT_EVENT L"TimeoutEvent" // // Private IOCTL to workaround #446466 (Whistler) // #define IOCTL_SEND_USB_REQUEST_PTP CTL_CODE(FILE_DEVICE_USB_SCAN,IOCTL_INDEX+20,METHOD_BUFFERED,FILE_ANY_ACCESS) // // Wake state // typedef enum { // No outstanding Wait-Wake IRP WAKESTATE_DISARMED = 1, // Wait-Wake IRP requested, not yet seen WAKESTATE_WAITING = 2, // Wait-Wake cancelled before IRP seen again WAKESTATE_WAITING_CANCELLED = 3, // Wait-Wake IRP seen and forwarded. Device is *probably* armed WAKESTATE_ARMED = 4, // Wait-Wake IRP seen and cancelled. Hasn't reached completion yet WAKESTATE_ARMING_CANCELLED = 5, // Wait-Wake IRP has passed the completion routine WAKESTATE_COMPLETING = 7 } WAKESTATE; // // Pipe buffer structure for the read pipe only. // typedef struct _PIPEBUFFER { PUCHAR pStartBuffer; PUCHAR pBuffer; PUCHAR pNextByte; ULONG RemainingData; KEVENT ReadSyncEvent; } PIPEBUFFER, *PPIPEBUFFER; // // Device Extension // typedef struct _USBSCAN_DEVICE_EXTENSION { PDEVICE_OBJECT pOwnDeviceObject; PDEVICE_OBJECT pStackDeviceObject; PDEVICE_OBJECT pPhysicalDeviceObject; ULONG DeviceInstance; UNICODE_STRING DeviceName; UNICODE_STRING SymbolicLinkName; KEVENT PendingIoEvent; ULONG PendingIoCount; BOOLEAN AcceptingRequests; BOOLEAN Stopped; // // Remote wakeup support. // KEVENT WakeCompletedEvent; LONG WakeState; PIRP pWakeIrp; BOOLEAN bEnabledForWakeup; // // USB descriptors from the device // PUSB_DEVICE_DESCRIPTOR pDeviceDescriptor; PUSB_CONFIGURATION_DESCRIPTOR pConfigurationDescriptor; PUSB_INTERFACE_DESCRIPTOR pInterfaceDescriptor; PUSB_ENDPOINT_DESCRIPTOR pEndpointDescriptor; USBD_CONFIGURATION_HANDLE ConfigurationHandle; USBD_PIPE_INFORMATION PipeInfo[MAX_NUM_PIPES]; ULONG NumberOfPipes; ULONG IndexBulkIn; ULONG IndexBulkOut; ULONG IndexInterrupt; // // Name of the device interface // UNICODE_STRING InterfaceNameString; // // Read pipe buffer // PIPEBUFFER ReadPipeBuffer[MAX_NUM_PIPES]; // // Power management variables // PIRP pPowerIrp; DEVICE_CAPABILITIES DeviceCapabilities; DEVICE_POWER_STATE CurrentDevicePowerState; // // For MP safe contention management. // KSPIN_LOCK SpinLock; } USBSCAN_DEVICE_EXTENSION, *PUSBSCAN_DEVICE_EXTENSION; typedef struct _TRANSFER_CONTEXT { ULONG RemainingTransferLength; ULONG ChunkSize; ULONG NBytesTransferred; PUCHAR pTransferBuffer; PUCHAR pOriginalTransferBuffer; PMDL pTransferMdl; ULONG PipeIndex; PURB pUrb; BOOLEAN fDestinedForReadBuffer; BOOLEAN fNextReadBlocked; PIRP pThisIrp; PDEVICE_OBJECT pDeviceObject; LARGE_INTEGER Timeout; KDPC TimerDpc; KTIMER Timer; } TRANSFER_CONTEXT, *PTRANSFER_CONTEXT; typedef struct _USBSCAN_FILE_CONTEXT { LONG PipeIndex; ULONG TimeoutRead; ULONG TimeoutWrite; ULONG TimeoutEvent; } USBSCAN_FILE_CONTEXT, *PUSBSCAN_FILE_CONTEXT; typedef struct _USBSCAN_PACKTES { PIRP pIrp; ULONG TimeoutCounter; BOOLEAN bCompleted; LIST_ENTRY PacketsEntry; } USBSCAN_PACKETS, *PUSBSCAN_PACKETS; #ifdef _WIN64 typedef struct _IO_BLOCK_32 { IN unsigned uOffset; IN unsigned uLength; IN OUT CHAR * POINTER_32 pbyData; IN unsigned uIndex; } IO_BLOCK_32, *PIO_BLOCK_32; typedef struct _IO_BLOCK_EX_32 { IN unsigned uOffset; IN unsigned uLength; IN OUT CHAR * POINTER_32 pbyData; IN unsigned uIndex; IN UCHAR bRequest; // Specific request IN UCHAR bmRequestType; // Bitmap - charateristics of request IN UCHAR fTransferDirectionIn; // TRUE - Device-->Host; FALSE - Host-->Device } IO_BLOCK_EX_32, *PIO_BLOCK_EX_32; #endif // _WIN64 // // prototypes // NTSTATUS // in usbscan9x.c DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); VOID // in usbscan9x.c USUnload( IN PDRIVER_OBJECT DriverObject ); VOID // in usbscan9x.c USIncrementIoCount( IN PDEVICE_OBJECT pDeviceObject ); LONG // in usbscan9x.c USDecrementIoCount( IN PDEVICE_OBJECT pDeviceObject ); NTSTATUS // in usbscan9x.c USDeferIrpCompletion( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context ); NTSTATUS // in usbscan9x.c USCreateSymbolicLink( PUSBSCAN_DEVICE_EXTENSION pde ); NTSTATUS // in usbscan9x.c USDestroySymbolicLink( PUSBSCAN_DEVICE_EXTENSION pde ); NTSTATUS // in usbscan9x.c USPnp( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); NTSTATUS // in usbscan9x.c USPnpAddDevice( IN PDRIVER_OBJECT pDriverObject, IN OUT PDEVICE_OBJECT pPhysicalDeviceObject ); NTSTATUS // in usbscan9x.c USGetUSBDeviceDescriptor( IN PDEVICE_OBJECT pDeviceObject ); NTSTATUS // in usbscan9x.c USBSCAN_CallUSBD( IN PDEVICE_OBJECT pDeviceObject, IN PURB pUrb ); NTSTATUS // in usbscan9x.c USConfigureDevice( IN PDEVICE_OBJECT pDeviceObject ); NTSTATUS // in usbscan9x.c USUnConfigureDevice( IN PDEVICE_OBJECT pDeviceObject ); NTSTATUS // in usbscan9x.c USGetDeviceCapability( IN PUSBSCAN_DEVICE_EXTENSION pde ); NTSTATUS // in usbscan9x.c UsbScanReadDeviceRegistry( IN PUSBSCAN_DEVICE_EXTENSION pExtension, IN PCWSTR pKeyName, OUT PVOID *ppvData ); NTSTATUS // in usbscan9x.c UsbScanWriteDeviceRegistry( IN PUSBSCAN_DEVICE_EXTENSION pExtension, IN PCWSTR pKeyName, IN ULONG Type, IN PVOID pvData, IN ULONG DataSize ); PURB USCreateConfigurationRequest( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN OUT PUSHORT Siz ); NTSTATUS USWaitWakeIoCompletionRoutine( PDEVICE_OBJECT pDeviceObject, PIRP pIrp, PVOID pContext ); BOOLEAN USArmForWake( PUSBSCAN_DEVICE_EXTENSION pde, POWER_STATE SystemState ); VOID USDisarmWake( PUSBSCAN_DEVICE_EXTENSION pde ); VOID USWaitWakePoCompletionRoutine( PDEVICE_OBJECT pDeviceObject, UCHAR MinorFunction, POWER_STATE State, PVOID pContext, PIO_STATUS_BLOCK pIoStatus ); VOID USInitializeWakeState( PUSBSCAN_DEVICE_EXTENSION pde ); VOID USQueuePassiveLevelCallback( IN PDEVICE_OBJECT pDeviceObject, IN PIO_WORKITEM_ROUTINE pCallbackFunction ); VOID USPassiveLevelReArmCallbackWorker( IN PDEVICE_OBJECT pDeviceObject, IN PVOID pContext ); LONG MyInterlockedOr( PKSPIN_LOCK pSpinLock, LONG volatile *Destination, LONG Value ); #ifdef ORIGINAL_POOLTRACK PVOID // in usbscan9x.c USAllocatePool( IN POOL_TYPE PoolType, IN ULONG ulNumberOfBytes ); VOID // in usbscan9x.c USFreePool( IN PVOID pvAddress ); #else // ORIGINAL_POOLTRACK #define USAllocatePool(a, b) ExAllocatePoolWithTag(a, b, NAME_POOLTAG) #define USFreePool(a) ExFreePool(a) #endif // ORIGINAL_POOLTRACK NTSTATUS // in ioctl.c USDeviceControl( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); NTSTATUS // in ioctl.c USReadWriteRegisters( IN PDEVICE_OBJECT pDeviceObject, IN PIO_BLOCK pIoBlock, IN BOOLEAN fRead, IN ULONG IoBlockSize ); NTSTATUS // in ioctl.c USPassThruUSBRequest( IN PDEVICE_OBJECT pDeviceObject, IN PIO_BLOCK_EX pIoBlockEx, IN ULONG InLength, IN ULONG OutLength ); NTSTATUS // in ioctl.c USPassThruUSBRequestPTP( IN PDEVICE_OBJECT pDeviceObject, IN PIO_BLOCK_EX pIoBlockEx, IN ULONG InLength, IN ULONG OutLength ); NTSTATUS // in ioctl.c USCancelPipe( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PIPE_TYPE PipeType, IN BOOLEAN fAbort ); NTSTATUS // in ioctl.c USAbortResetPipe( IN PDEVICE_OBJECT pDeviceObject, IN ULONG uIndex, IN BOOLEAN fAbort ); NTSTATUS // in ocrw.c USOpen( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); NTSTATUS // in ocrw.c USClose( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); NTSTATUS // in ocrw.c USFlush( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); NTSTATUS // in ocrw.c USRead( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); NTSTATUS // in ocrw.c USWrite( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); NTSTATUS // in ocrw.c USTransfer( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN ULONG PipeIndex, IN PVOID pBuffer, IN PMDL pMdl, IN ULONG TransferSize, IN PULONG pTimeout ); NTSTATUS // in ocrw.c USTransferComplete( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PTRANSFER_CONTEXT pTransferContext ); VOID // in ocrw.c USCancelIrp( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); NTSTATUS // in ocrw.c USEnqueueIrp( IN PDEVICE_OBJECT pDeviceObject, IN PUSBSCAN_PACKETS pPackets ); PUSBSCAN_PACKETS // in ocrw.c USDequeueIrp( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); VOID // in ocrw.c USWaitThread( IN PVOID pTransferContext ); ULONG USGetPipeIndexToUse( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN ULONG PipeIndex ); VOID USTimerDpc( IN PKDPC pDpc, IN PVOID pIrp, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); NTSTATUS // in power.c USPower( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ); NTSTATUS // in power.c USPoRequestCompletion( IN PDEVICE_OBJECT pPdo, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PDEVICE_OBJECT pDeviceObject, IN PIO_STATUS_BLOCK pIoStatus ); NTSTATUS // in power.c USSetDevicePowerState( IN PDEVICE_OBJECT pDeviceObject, IN DEVICE_POWER_STATE DeviceState, IN PBOOLEAN pHookIt ); NTSTATUS USSystemPowerIrpComplete( IN PDEVICE_OBJECT pPdo, IN PIRP pIrp, IN PDEVICE_OBJECT pDeviceObject ); NTSTATUS USDevicePowerIrpComplete( IN PDEVICE_OBJECT pPdo, IN PIRP pIrp, IN PDEVICE_OBJECT pDeviceObject ); NTSTATUS USCallNextDriverSynch( IN PUSBSCAN_DEVICE_EXTENSION pde, IN PIRP pIrp ); NTSTATUS UsbScanHandleInterface( PDEVICE_OBJECT DeviceObject, PUNICODE_STRING InterfaceName, BOOLEAN Create ); VOID UsbScanLogError( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN ULONG SequenceNumber, IN UCHAR MajorFunctionCode, IN UCHAR RetryCount, IN ULONG UniqueErrorValue, IN NTSTATUS FinalStatus, IN NTSTATUS SpecificIOStatus );