📄 usb.h.bak
字号:
#include <initguid.h>
// {00873FDF-61A8-11d1-AA5E-00C04FB1728B}
DEFINE_GUID(GUID_CLASS_I68001_BULK,0x873fdf, 0x61a8, 0x11d1, 0xaa, 0x5e, 0x0, 0xc0, 0x4f, 0xb1, 0x72, 0x8b);
#ifndef USBH_INC
#define USBH_INC
#define USB_IOCTL_INDEX 0x0000
#define IOCTL_USB_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, \
USB_IOCTL_INDEX,\
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_RESET_DEVICE CTL_CODE(FILE_DEVICE_UNKNOWN, \
USB_IOCTL_INDEX+1,\
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_RESET_PIPE CTL_CODE(FILE_DEVICE_UNKNOWN, \
USB_IOCTL_INDEX+2,\
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#endif
#ifndef BUSBDBG_INCD
#define BUSBDBG_INCD
#if DBG
#define DBGLVL_OFF 0 // if gDebugLevel set to this, there is NO debug output
#define DBGLVL_MINIMUM 1 // minimum verbosity
#define DBGLVL_DEFAULT 2 // default verbosity level if no registry override
#define DBGLVL_MEDIUM 3 // medium verbosity
#define DBGLVL_HIGH 4 // highest 'safe' level (without severely affecting timing )
#define DBGLVL_MAXIMUM 5 // maximum level, may be dangerous
#ifndef DBGSTR_PREFIX
#define DBGSTR_PREFIX "USB: "
#endif
// registry path used for parameters global to all instances of the driver
#define USB_REGISTRY_PARAMETERS_PATH \
L"\\REGISTRY\\Machine\\System\\CurrentControlSet\\SERVICES\\USB\\Parameters"
#define DPRINT DbgPrint
#define TRAP() DbgBreakPoint();
#define USB_DBGOUTSIZE 512
typedef struct _USB_DBGDATA {
// mirrors device extension pending io count
ULONG PendingIoCount;
// count of pipe errors detected during the life of this device instance
ULONG PipeErrorCount;
// count of pipe resets performed during the life of this device instance
ULONG ResetPipeCount;
// count of pipe resets performed during the life of this device instance
ULONG AbortPipeCount;
} USB_DBGDATA, *PUSB_DBGDATA;
//these declared in debug 'c' file
extern int gDebugLevel;
extern int gExAllocCount;
extern PUSB_DBGDATA gpDbg;
static const PCHAR szIrpMajFuncDesc[] =
{ // note this depends on corresponding values to the indexes in wdm.h
"IRP_MJ_CREATE",
"IRP_MJ_CREATE_NAMED_PIPE",
"IRP_MJ_CLOSE",
"IRP_MJ_READ",
"IRP_MJ_WRITE",
"IRP_MJ_QUERY_INFORMATION",
"IRP_MJ_SET_INFORMATION",
"IRP_MJ_QUERY_EA",
"IRP_MJ_SET_EA",
"IRP_MJ_FLUSH_BUFFERS",
"IRP_MJ_QUERY_VOLUME_INFORMATION",
"IRP_MJ_SET_VOLUME_INFORMATION",
"IRP_MJ_DIRECTORY_CONTROL",
"IRP_MJ_FILE_SYSTEM_CONTROL",
"IRP_MJ_DEVICE_CONTROL",
"IRP_MJ_INTERNAL_DEVICE_CONTROL",
"IRP_MJ_SHUTDOWN",
"IRP_MJ_LOCK_CONTROL",
"IRP_MJ_CLEANUP",
"IRP_MJ_CREATE_MAILSLOT",
"IRP_MJ_QUERY_SECURITY",
"IRP_MJ_SET_SECURITY",
"IRP_MJ_POWER",
"IRP_MJ_SYSTEM_CONTROL",
"IRP_MJ_DEVICE_CHANGE",
"IRP_MJ_QUERY_QUOTA",
"IRP_MJ_SET_QUOTA",
"IRP_MJ_PNP"
};
//IRP_MJ_MAXIMUM_FUNCTION defined in wdm.h
static const PCHAR szPnpMnFuncDesc[] =
{ // note this depends on corresponding values to the indexes in wdm.h
"IRP_MN_START_DEVICE",
"IRP_MN_QUERY_REMOVE_DEVICE",
"IRP_MN_REMOVE_DEVICE",
"IRP_MN_CANCEL_REMOVE_DEVICE",
"IRP_MN_STOP_DEVICE",
"IRP_MN_QUERY_STOP_DEVICE",
"IRP_MN_CANCEL_STOP_DEVICE",
"IRP_MN_QUERY_DEVICE_RELATIONS",
"IRP_MN_QUERY_INTERFACE",
"IRP_MN_QUERY_CAPABILITIES",
"IRP_MN_QUERY_RESOURCES",
"IRP_MN_QUERY_RESOURCE_REQUIREMENTS",
"IRP_MN_QUERY_DEVICE_TEXT",
"IRP_MN_FILTER_RESOURCE_REQUIREMENTS",
"IRP_MN_READ_CONFIG",
"IRP_MN_WRITE_CONFIG",
"IRP_MN_EJECT",
"IRP_MN_SET_LOCK",
"IRP_MN_QUERY_ID",
"IRP_MN_QUERY_PNP_DEVICE_STATE",
"IRP_MN_QUERY_BUS_INFORMATION",
"IRP_MN_DEVICE_USAGE_NOTIFICATION",
"IRP_MN_SURPRISE_REMOVAL"
};
#define IRP_PNP_MN_FUNCMAX IRP_MN_SURPRISE_REMOVAL
static const PCHAR szSystemPowerState[] =
{
"PowerSystemUnspecified",
"PowerSystemWorking",
"PowerSystemSleeping1",
"PowerSystemSleeping2",
"PowerSystemSleeping3",
"PowerSystemHibernate",
"PowerSystemShutdown",
"PowerSystemMaximum"
};
static const PCHAR szDevicePowerState[] =
{
"PowerDeviceUnspecified",
"PowerDeviceD0",
"PowerDeviceD1",
"PowerDeviceD2",
"PowerDeviceD3",
"PowerDeviceMaximum"
};
BOOLEAN
USB_GetRegistryDword(
IN PWCHAR RegPath,
IN PWCHAR ValueName,
IN OUT PULONG Value
);
#define USB_KdPrintCond( ilev, cond, _x_) \
if( gDebugLevel && ( ilev <= gDebugLevel ) && ( cond )) { \
DPRINT( DBGSTR_PREFIX ); \
DPRINT _x_ ; \
}
#define USB_KdPrint( ilev, _x_) USB_KdPrintCond( ilev, TRUE, _x_ )
#define USB_TrapCond( ilev, cond ) if ( gDebugLevel && ( ilev <= gDebugLevel ) && (cond) ) TRAP()
#define USB_Trap( ilev ) USB_TrapCond( ilev, TRUE )
#define USB_ASSERT( cond ) ASSERT( cond )
#define USB_StringForDevState( devState ) szDevicePowerState[ devState ]
#define USB_StringForSysState( sysState ) szSystemPowerState[ sysState ]
#define USB_StringForPnpMnFunc( mnfunc ) szPnpMnFuncDesc[ mnfunc ]
#define USB_StringForIrpMjFunc( mjfunc ) szIrpMajFuncDesc[ mjfunc ]
PVOID
USB_ExAllocatePool(
IN POOL_TYPE PoolType,
IN ULONG NumberOfBytes
);
VOID
USB_ExFreePool(
IN PVOID p
);
#else // if not DBG
// dummy definitions that go away in the retail build
#define USB_KdPrintCond( ilev, cond, _x_)
#define USB_KdPrint( ilev, _x_)
#define USB_TrapCond( ilev, cond )
#define USB_Trap( ilev )
#define USB_ASSERT( cond )
#define USB_StringForDevState( devState )
#define USB_StringForSysState( sysState )
#define USB_StringForPnpMnFunc( mnfunc )
#define USB_StringForIrpMjFunc( mjfunc )
#define USB_ExAllocatePool( typ, siz ) ExAllocatePool( typ, siz )
#define USB_ExFreePool( p ) ExFreePool( p )
#endif //DBG
#endif // included
#define USB_TEST_BOARD_TRANSFER_BUFFER_SIZE (64 *1024 )
#define USB_MAX_TRANSFER_SIZE 256
typedef struct _USB_RW_CONTEXT {
PURB Urb;
PDEVICE_OBJECT DeviceObject;
PIRP Irp;
PMDL Mdl;
} USB_RW_CONTEXT, *PUSB_RW_CONTEXT;
typedef struct USB_PIPEINFO {
BOOLEAN fPipeOpened;
} USB_PIPEINFO, *PUSB_PIPEINFO;
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT TopOfStackDeviceObject;
PDEVICE_OBJECT PhysicalDeviceObject;
DEVICE_POWER_STATE CurrentDevicePowerState;
USBD_CONFIGURATION_HANDLE UsbConfigurationHandle;
PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor;
PUSB_DEVICE_DESCRIPTOR UsbDeviceDescriptor;
PUSBD_INTERFACE_INFORMATION UsbInterface;
DEVICE_CAPABILITIES DeviceCapabilities;
PIRP PowerIrp;
PIRP BaseIrp;
PURB BaseUrb;
ULONG StagedPendingIrpCount;
ULONG StagedBytesTransferred;
KEVENT RemoveEvent;
KEVENT StagingDoneEvent;
KEVENT NoPendingIoEvent;
KEVENT SelfRequestedPowerIrpEvent;
KSPIN_LOCK IoCountSpinLock;
ULONG PendingIoCount;
ULONG OpenPipeCount;
PUSB_PIPEINFO PipeInfo;
PUSB_RW_CONTEXT PendingIoIrps;
WCHAR DeviceLinkNameBuffer[ MAXIMUM_FILENAME_LENGTH ];
BOOLEAN DeviceRemoved;
BOOLEAN RemoveDeviceRequested;
BOOLEAN StopDeviceRequested;
BOOLEAN DeviceStarted;
BOOLEAN EnabledForWakeup;
BOOLEAN SelfPowerIrp;
ULONG PowerDownLevel;
ULONG MaximumTransferSize;
KSPIN_LOCK FastCompleteSpinlock;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// function prototypes
NTSTATUS
USB_ProcessPnPIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USB_ProcessSysControlIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
USB_Unload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
USB_StartDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USB_StopDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USB_RemoveDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USB_CallUSBD(
IN PDEVICE_OBJECT DeviceObject,
IN PURB Urb
);
NTSTATUS
USB_PnPAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
);
NTSTATUS
USB_CreateDeviceObject(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PDEVICE_OBJECT *DeviceObject
);
NTSTATUS
USB_ConfigureDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USB_IrpCompletionRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
USB_PoRequestCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE PowerState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus
);
NTSTATUS
USB_PoSelfRequestCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE PowerState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus
);
PURB
USB_BuildAsyncRequest(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PUSBD_PIPE_INFORMATION PipeHandle,
IN BOOLEAN Read
);
NTSTATUS
USB_GetPortStatus(
IN PDEVICE_OBJECT DeviceObject,
IN PULONG PortStatus
);
NTSTATUS
USB_ResetParentPort(
IN IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USB_SelfRequestPowerIrp(
IN PDEVICE_OBJECT DeviceObject,
IN POWER_STATE PowerState
);
BOOLEAN
USB_SetDevicePowerState(
IN PDEVICE_OBJECT DeviceObject,
IN DEVICE_POWER_STATE DeviceState
);
NTSTATUS
USB_AsyncReadWrite_Complete(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
USB_SimpleReadWrite_Complete(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
USB_PowerIrp_Complete(
IN PDEVICE_OBJECT NullDeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
USB_QueryCapabilities(
IN PDEVICE_OBJECT PdoDeviceObject,
IN PDEVICE_CAPABILITIES DeviceCapabilities
);
NTSTATUS
USB_Write(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USB_Create(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USB_Read(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USB_AbortPipes(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USB_ProcessIOCTL(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USB_SelectInterface(
IN PDEVICE_OBJECT DeviceObject,
IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
);
NTSTATUS
USB_ResetDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USB_Close(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USB_ResetPipe(
IN PDEVICE_OBJECT DeviceObject,
IN PUSBD_PIPE_INFORMATION PipeInfo
);
VOID
USB_IncrementIoCount(
IN PDEVICE_OBJECT DeviceObject
);
LONG
USB_DecrementIoCount(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
USB_ProcessPowerIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
USB_StagedReadWrite(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN BOOLEAN Read
);
NTSTATUS
USB_SelfSuspendOrActivate(
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN fSuspend
);
NTSTATUS
USB_SymbolicLink(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PUNICODE_STRING deviceLinkUnicodeString
);
BOOLEAN
USB_CancelPendingIo(
IN PDEVICE_OBJECT DeviceObject
);
BOOLEAN
USB_CanAcceptIoRequests(
IN PDEVICE_OBJECT DeviceObject
);
PUSB_PIPEINFO USB_PipeWithName(
IN PDEVICE_OBJECT DeviceObject,
IN PUNICODE_STRING FileName
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -