📄 windrvr.h
字号:
UCHAR bmAttributes;
USHORT wMaxPacketSize;
UCHAR bInterval;
} WDU_ENDPOINT_DESCRIPTOR;
typedef struct
{
UCHAR bLength;
UCHAR bDescriptorType;
USHORT wTotalLength;
UCHAR bNumInterfaces;
UCHAR bConfigurationValue;
UCHAR iConfiguration;
UCHAR bmAttributes;
UCHAR MaxPower;
} WDU_CONFIGURATION_DESCRIPTOR;
typedef struct
{
UCHAR bLength;
UCHAR bDescriptorType;
USHORT bcdUSB;
UCHAR bDeviceClass;
UCHAR bDeviceSubClass;
UCHAR bDeviceProtocol;
UCHAR bMaxPacketSize0;
USHORT idVendor;
USHORT idProduct;
USHORT bcdDevice;
UCHAR iManufacturer;
UCHAR iProduct;
UCHAR iSerialNumber;
UCHAR bNumConfigurations;
} WDU_DEVICE_DESCRIPTOR;
typedef struct
{
WDU_INTERFACE_DESCRIPTOR Descriptor;
WDU_ENDPOINT_DESCRIPTOR *pEndpointDescriptors;
WDU_PIPE_INFO *pPipes;
} WDU_ALTERNATE_SETTING;
typedef struct
{
WDU_ALTERNATE_SETTING *pAlternateSettings;
DWORD dwNumAltSettings;
WDU_ALTERNATE_SETTING *pActiveAltSetting;
} WDU_INTERFACE;
typedef struct
{
WDU_CONFIGURATION_DESCRIPTOR Descriptor;
DWORD dwNumInterfaces;
WDU_INTERFACE *pInterfaces;
} WDU_CONFIGURATION;
typedef struct {
WDU_DEVICE_DESCRIPTOR Descriptor;
WDU_PIPE_INFO Pipe0;
WDU_CONFIGURATION *pConfigs;
WDU_CONFIGURATION *pActiveConfig;
WDU_INTERFACE *pActiveInterface[WD_USB_MAX_INTERFACES];
} WDU_DEVICE;
// note: any devices found matching this table will be controlled by WD
typedef struct
{
WORD wVendorId;
WORD wProductId;
BYTE bDeviceClass;
BYTE bDeviceSubClass;
BYTE bInterfaceClass;
BYTE bInterfaceSubClass;
BYTE bInterfaceProtocol;
} WDU_MATCH_TABLE;
// IOCTL's parameters
typedef struct
{
DWORD dwUniqueID;
PVOID pBuf;
DWORD dwBytes;
DWORD dwOptions;
} WDU_GET_DEVICE_DATA;
// dwOptions values for WDU_GET_DEVICE_DATA structures;
// Currently unsupported
typedef enum
{
WDU_FORCE_CONFIG_REQ = 0x1
} WDU_GET_DEVICE_DATA_OPTION;
// these enum values can be used as dwProperty values, see structure
// WD_GET_DEVICE_PROPERTY below.
typedef enum
{
WdDevicePropertyDeviceDescription,
WdDevicePropertyHardwareID,
WdDevicePropertyCompatibleIDs,
WdDevicePropertyBootConfiguration,
WdDevicePropertyBootConfigurationTranslated,
WdDevicePropertyClassName,
WdDevicePropertyClassGuid,
WdDevicePropertyDriverKeyName,
WdDevicePropertyManufacturer,
WdDevicePropertyFriendlyName,
WdDevicePropertyLocationInformation,
WdDevicePropertyPhysicalDeviceObjectName,
WdDevicePropertyBusTypeGuid,
WdDevicePropertyLegacyBusType,
WdDevicePropertyBusNumber,
WdDevicePropertyEnumeratorName,
WdDevicePropertyAddress,
WdDevicePropertyUINumber,
WdDevicePropertyInstallState,
WdDevicePropertyRemovalPolicy
} WD_DEVICE_REGISTRY_PROPERTY;
typedef enum
{
WD_DEVICE_PCI = 0x1,
WD_DEVICE_USB = 0x2
} WD_GET_DEVICE_PROPERTY_OPTION;
typedef struct
{
union
{
HANDLE hDevice;
DWORD dwUniqueID;
} h;
PVOID pBuf;
DWORD dwBytes;
DWORD dwProperty;
DWORD dwOptions;
} WD_GET_DEVICE_PROPERTY;
typedef struct
{
DWORD dwUniqueID;
DWORD dwInterfaceNum;
DWORD dwAlternateSetting;
DWORD dwOptions;
} WDU_SET_INTERFACE;
typedef struct
{
DWORD dwUniqueID;
DWORD dwPipeNum;
DWORD dwOptions;
} WDU_RESET_PIPE;
typedef enum {
WDU_WAKEUP_ENABLE = 0x1,
WDU_WAKEUP_DISABLE = 0x2
} WDU_WAKEUP_OPTIONS;
typedef struct
{
DWORD dwUniqueID;
DWORD dwPipeNum;
DWORD dwOptions;
} WDU_HALT_TRANSFER;
typedef struct
{
DWORD dwUniqueID;
DWORD dwOptions;
} WDU_WAKEUP;
typedef struct
{
DWORD dwUniqueID;
DWORD dwOptions;
} WDU_RESET_DEVICE;
typedef struct
{
DWORD dwUniqueID;
DWORD dwPipeNum; // Pipe number on device.
DWORD fRead; // TRUE for read (IN) transfers; FALSE for write (OUT) transfers.
DWORD dwOptions; // USB_TRANSFER options:
// USB_ISOCH_FULL_PACKETS_ONLY - For isochronous
// transfers only. If set, only full packets will be
// transmitted and the transfer function will return
// when the amount of bytes left to transfer is less
// than the maximum packet size for the pipe (the
// function will return without transmitting the
// remaining bytes).
PVOID pBuffer; // Pointer to buffer to read/write.
DWORD dwBufferSize; // Amount of bytes to transfer.
DWORD dwBytesTransferred; // Returns the number of bytes actually read/written
BYTE SetupPacket[8]; // Setup packet for control pipe transfer.
DWORD dwTimeout; // Timeout for the transfer in milliseconds. Set to 0 for infinite wait.
} WDU_TRANSFER;
typedef struct
{
DWORD dwUniqueID;
UCHAR bType;
UCHAR bIndex;
WORD wLength;
PVOID pBuffer;
WORD wLanguage;
} WDU_GET_DESCRIPTOR;
typedef enum {
WD_STATUS_SUCCESS = 0x0L,
WD_STATUS_INVALID_WD_HANDLE = (int)0xffffffffL,
WD_WINDRIVER_STATUS_ERROR = 0x20000000L,
WD_INVALID_HANDLE = 0x20000001L,
WD_INVALID_PIPE_NUMBER = 0x20000002L,
WD_READ_WRITE_CONFLICT = 0x20000003L, // request to read from an
// OUT (write) pipe or request to write to an IN (read) pipe
WD_ZERO_PACKET_SIZE = 0x20000004L, // maximum packet size is zero
WD_INSUFFICIENT_RESOURCES = 0x20000005L,
WD_UNKNOWN_PIPE_TYPE = 0x20000006L,
WD_SYSTEM_INTERNAL_ERROR = 0x20000007L,
WD_DATA_MISMATCH = 0x20000008L,
WD_NO_LICENSE = 0x20000009L,
WD_NOT_IMPLEMENTED = 0x2000000aL,
WD_KERPLUG_FAILURE = 0x2000000bL,
WD_FAILED_ENABLING_INTERRUPT = 0x2000000cL,
WD_INTERRUPT_NOT_ENABLED = 0x2000000dL,
WD_RESOURCE_OVERLAP = 0x2000000eL,
WD_DEVICE_NOT_FOUND = 0x2000000fL,
WD_WRONG_UNIQUE_ID = 0x20000010L,
WD_OPERATION_ALREADY_DONE = 0x20000011L,
WD_USB_DESCRIPTOR_ERROR = 0x20000012L,
WD_SET_CONFIGURATION_FAILED = 0x20000013L,
WD_CANT_OBTAIN_PDO = 0x20000014L,
WD_TIME_OUT_EXPIRED = 0x20000015L,
WD_IRP_CANCELED = 0x20000016L,
WD_FAILED_USER_MAPPING = 0x20000017L,
WD_FAILED_KERNEL_MAPPING = 0x20000018L,
WD_NO_RESOURCES_ON_DEVICE = 0x20000019L,
WD_NO_EVENTS = 0x2000001aL,
WD_INVALID_PARAMETER = 0x2000001bL,
WD_INCORRECT_VERSION = 0x2000001cL,
WD_TRY_AGAIN = 0x2000001dL,
WD_WINDRIVER_NOT_FOUND = 0x2000001eL,
WD_INVALID_IOCTL = 0x2000001fL,
WD_OPERATION_FAILED = 0x20000020L,
WD_INVALID_32BIT_APP = 0x20000021L,
// The following status codes are returned by USBD:
// USBD status types:
WD_USBD_STATUS_SUCCESS = 0x00000000L,
WD_USBD_STATUS_PENDING = 0x40000000L,
WD_USBD_STATUS_ERROR = (int)0x80000000L,
WD_USBD_STATUS_HALTED = (int)0xC0000000L,
// USBD status codes:
// NOTE: The following status codes are comprised of one of the status
// types above and an error code [i.e. 0xXYYYYYYYL - where: X = status type;
// YYYYYYY = error code].
// The same error codes may also appear with one of the other status types
// as well.
// HC (Host Controller) status codes.
// [NOTE: These status codes use the WD_USBD_STATUS_HALTED status type]:
WD_USBD_STATUS_CRC = (int)0xC0000001L,
WD_USBD_STATUS_BTSTUFF = (int)0xC0000002L,
WD_USBD_STATUS_DATA_TOGGLE_MISMATCH = (int)0xC0000003L,
WD_USBD_STATUS_STALL_PID = (int)0xC0000004L,
WD_USBD_STATUS_DEV_NOT_RESPONDING = (int)0xC0000005L,
WD_USBD_STATUS_PID_CHECK_FAILURE = (int)0xC0000006L,
WD_USBD_STATUS_UNEXPECTED_PID = (int)0xC0000007L,
WD_USBD_STATUS_DATA_OVERRUN = (int)0xC0000008L,
WD_USBD_STATUS_DATA_UNDERRUN = (int)0xC0000009L,
WD_USBD_STATUS_RESERVED1 = (int)0xC000000AL,
WD_USBD_STATUS_RESERVED2 = (int)0xC000000BL,
WD_USBD_STATUS_BUFFER_OVERRUN = (int)0xC000000CL,
WD_USBD_STATUS_BUFFER_UNDERRUN = (int)0xC000000DL,
#if defined(WINCE)
WD_USBD_STATUS_NOT_ACCESSED_ALT = (int)0xC000000FL, // HCD maps this to E when encountered
WD_USBD_STATUS_NOT_ACCESSED = (int)0xC000000EL,
#else
WD_USBD_STATUS_NOT_ACCESSED = (int)0xC000000FL,
#endif
WD_USBD_STATUS_FIFO = (int)0xC0000010L,
#if defined(WINNT)
WD_USBD_STATUS_XACT_ERROR = (int)0xC0000011L,
WD_USBD_STATUS_BABBLE_DETECTED = (int)0xC0000012L,
WD_USBD_STATUS_DATA_BUFFER_ERROR = (int)0xC0000013L,
#endif
#if defined(WINCE)
WD_USBD_STATUS_ISOCH = 0xC0000100L,
WD_USBD_STATUS_CANCELED = 0xC0000101L,
WD_USBD_STATUS_NOT_COMPLETE = (int)0xC0000103L,
WD_USBD_STATUS_CLIENT_BUFFER = (int)0xC0000104L,
#else
WD_USBD_STATUS_CANCELED = (int)0xC0010000L,
#endif
// Returned by HCD (Host Controller Driver) if a transfer is submitted to
// an endpoint that is stalled:
WD_USBD_STATUS_ENDPOINT_HALTED = (int)0xC0000030L,
// Software status codes
// [NOTE: The following status codes have only the error bit set]:
WD_USBD_STATUS_NO_MEMORY = (int)0x80000100L,
WD_USBD_STATUS_INVALID_URB_FUNCTION = (int)0x80000200L,
WD_USBD_STATUS_INVALID_PARAMETER = (int)0x80000300L,
// Returned if client driver attempts to close an endpoint/interface
// or configuration with outstanding transfers:
WD_USBD_STATUS_ERROR_BUSY = (int)0x80000400L,
// Returned by USBD if it cannot complete a URB request. Typically this
// will be returned in the URB status field when the Irp is completed
// with a more specific error code. [The Irp status codes are indicated
// in WinDriver's Debug Monitor tool (wddebug/wddebug_gui):
WD_USBD_STATUS_REQUEST_FAILED = (int)0x80000500L,
WD_USBD_STATUS_INVALID_PIPE_HANDLE = (int)0x80000600L,
// Returned when there is not enough bandwidth available
// to open a requested endpoint:
WD_USBD_STATUS_NO_BANDWIDTH = (int)0x80000700L,
// Generic HC (Host Controller) error:
WD_USBD_STATUS_INTERNAL_HC_ERROR = (int)0x80000800L,
// Returned when a short packet terminates the transfer
// i.e. USBD_SHORT_TRANSFER_OK bit not set:
WD_USBD_STATUS_ERROR_SHORT_TRANSFER = (int)0x80000900L,
// Returned if the requested start frame is not within
// USBD_ISO_START_FRAME_RANGE of the current USB frame,
// NOTE: The stall bit is set:
WD_USBD_STATUS_BAD_START_FRAME = (int)0xC0000A00L,
// Returned by HCD (Host Controller Driver) if all packets in an
// isochronous transfer complete with an error:
WD_USBD_STATUS_ISOCH_REQUEST_FAILED = (int)0xC0000B00L,
// Returned by USBD if the frame length control for a given
// HC (Host Controller) is already taken by another driver:
WD_USBD_STATUS_FRAME_CONTROL_OWNED = (int)0xC0000C00L,
// Returned by USBD if the caller does not own frame length control and
// attempts to release or modify the HC frame length:
WD_USBD_STATUS_FRAME_CONTROL_NOT_OWNED = (int)0xC0000D00L
#if defined(WIN32)
,
// Additional USB 2.0 software error codes added for USB 2.0:
WD_USBD_STATUS_NOT_SUPPORTED = (int)0xC0000E00L, // Returned for APIS not supported/implemented
WD_USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR = (int)0xC0000F00L,
WD_USBD_STATUS_INSUFFICIENT_RESOURCES = (int)0xC0001000L,
WD_USBD_STATUS_SET_CONFIG_FAILED = (int)0xC0002000L,
WD_USBD_STATUS_BUFFER_TOO_SMALL = (int)0xC0003000L,
WD_USBD_STATUS_INTERFACE_NOT_FOUND = (int)0xC0004000L,
WD_USBD_STATUS_INAVLID_PIPE_FLAGS = (int)0xC0005000L,
WD_USBD_STATUS_TIMEOUT = (int)0xC0006000L,
WD_USBD_STATUS_DEVICE_GONE = (int)0xC0007000L,
WD_USBD_STATUS_STATUS_NOT_MAPPED = (int)0xC0008000L,
// Extended isochronous error codes returned by USBD.
// These errors appear in the packet status field of an isochronous
// transfer.
// For some reason the controller did not access the TD associated with
// this packet:
WD_USBD_STATUS_ISO_NOT_ACCESSED_BY_HW = (int)0xC0020000L,
// Controller reported an error in the TD.
// Since TD errors are controller specific they are reported
// generically with this error code:
WD_USBD_STATUS_ISO_TD_ERROR = (int)0xC0030000L,
// The packet was submitted in time by the client but
// failed to reach the miniport in time:
WD_USBD_STATUS_ISO_NA_LATE_USBPORT = (int)0xC0040000L,
// The packet was not sent because the client submitted it too late
// to transmit:
WD_USBD_STATUS_ISO_NOT_ACCESSED_LATE = (int)0xC0050000L
#endif
} WD_ERROR_CODES;
typedef struct
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -