From 5fbb30c493326de68b7b93234a607ad13114a52a Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 4 Mar 2010 22:58:41 +0000 Subject: [PATCH] More work on USB related definitions svn path=/branches/header-work/; revision=45846 --- include/ddk/usbbusif.h | 42 +-- include/ddk/usbdlib.h | 118 +++--- include/ddk/usbprotocoldefs.h | 677 ++++++++++++++++++++++++++++++++++ include/ddk/usbscan.h | 68 ++-- include/ddk/usbstorioctl.h | 64 ++++ 5 files changed, 848 insertions(+), 121 deletions(-) create mode 100644 include/ddk/usbprotocoldefs.h create mode 100644 include/ddk/usbstorioctl.h diff --git a/include/ddk/usbbusif.h b/include/ddk/usbbusif.h index 77b22ee3fe7..0483738b18a 100644 --- a/include/ddk/usbbusif.h +++ b/include/ddk/usbbusif.h @@ -18,13 +18,13 @@ typedef NTSTATUS typedef VOID (USB_BUSIFFN *PUSB_BUSIFFN_GETUSBDI_VERSION) ( IN PVOID, - OUT PUSBD_VERSION_INFORMATION, - OUT PULONG); + OUT PUSBD_VERSION_INFORMATION OPTIONAL, + OUT PULONG OPTIONAL); typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME) ( IN PVOID, - OUT PULONG); + OUT PULONG OPTIONAL); typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_ENUM_LOG_ENTRY) ( @@ -32,31 +32,31 @@ typedef NTSTATUS IN ULONG, IN ULONG, IN ULONG, - IN ULONG); + IN ULONG); typedef struct _USB_BUS_INFORMATION_LEVEL_0 { ULONG TotalBandwidth; - ULONG ConsumedBandwidth; + ULONG ConsumedBandwidth; } USB_BUS_INFORMATION_LEVEL_0, *PUSB_BUS_INFORMATION_LEVEL_0; typedef struct _USB_BUS_INFORMATION_LEVEL_1 { ULONG TotalBandwidth; - ULONG ConsumedBandwidth; + ULONG ConsumedBandwidth; ULONG ControllerNameLength; - WCHAR ControllerNameUnicodeString[1]; + WCHAR ControllerNameUnicodeString[1]; } USB_BUS_INFORMATION_LEVEL_1, *PUSB_BUS_INFORMATION_LEVEL_1; typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_INFORMATION) ( IN PVOID, IN ULONG, - INout PVOID, + IN OUT PVOID, OUT PULONG, - OUT PULONG); + OUT PULONG OPTIONAL); typedef BOOLEAN (USB_BUSIFFN *PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED) ( - IN PVOID); + IN PVOID OPTIONAL); #define USB_BUSIF_USBDI_VERSION_0 0x0000 #define USB_BUSIF_USBDI_VERSION_1 0x0001 @@ -111,19 +111,19 @@ typedef struct _USB_BUS_INTERFACE_USBDI_V2 { typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME_EX) ( - IN PVOID, - OUT PULONG); + IN PVOID OPTIONAL, + OUT PULONG OPTIONAL); typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_CONTROLLER_TYPE) ( - IN PVOID, - OUT PULONG, - OUT PUSHORT, - OUT PUSHORT, - OUT PUCHAR, - OUT PUCHAR, - OUT PUCHAR, - OUT PUCHAR); + IN PVOID OPTIONAL, + OUT PULONG OPTIONAL, + OUT PUSHORT OPTIONAL, + OUT PUSHORT OPTIONAL, + OUT PUCHAR OPTIONAL, + OUT PUCHAR OPTIONAL, + OUT PUCHAR OPTIONAL, + OUT PUCHAR OPTIONAL); typedef struct _USB_BUS_INTERFACE_USBDI_V3 { USHORT Size; @@ -162,7 +162,7 @@ NTSTATUS (USB_BUSIFFN *USBC_START_DEVICE_CALLBACK)( IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor, IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - PUSBC_FUNCTION_DESCRIPTOR *FunctionDescriptorBuffer, + OUT PUSBC_FUNCTION_DESCRIPTOR *FunctionDescriptorBuffer, OUT PULONG FunctionDescriptorBufferLength, IN PDEVICE_OBJECT FdoDeviceObject, IN PDEVICE_OBJECT PdoDeviceObject); diff --git a/include/ddk/usbdlib.h b/include/ddk/usbdlib.h index 3bb214b92aa..7f21da67b51 100644 --- a/include/ddk/usbdlib.h +++ b/include/ddk/usbdlib.h @@ -1,12 +1,9 @@ -#ifndef USBDLIB_H__ -#define USBDLIB_H__ +#pragma once - -typedef struct _USBD_INTERFACE_LIST_ENTRY -{ - PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; - PUSBD_INTERFACE_INFORMATION Interface; -}USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY; +typedef struct _USBD_INTERFACE_LIST_ENTRY { + PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; + PUSBD_INTERFACE_INFORMATION Interface; +} USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY; #define UsbBuildInterruptOrBulkTransferRequest(urb,length, pipeHandle, transferBuffer, transferBufferMDL, transferBufferLength, transferFlags, link) \ { \ @@ -44,7 +41,6 @@ typedef struct _USBD_INTERFACE_LIST_ENTRY (urb)->UrbControlGetStatusRequest.UrbLink = (link); \ } - #define UsbBuildFeatureRequest(urb, op, featureSelector, index, link) \ { \ (urb)->UrbHeader.Function = (op); \ @@ -120,102 +116,87 @@ typedef struct _USBD_INTERFACE_LIST_ENTRY #define GET_ISO_URB_SIZE(n) (sizeof(struct _URB_ISOCH_TRANSFER)+ \ sizeof(USBD_ISO_PACKET_DESCRIPTOR)*n) - #ifndef _USBD_ DECLSPEC_IMPORT VOID NTAPI USBD_GetUSBDIVersion( - OUT PUSBD_VERSION_INFORMATION VersionInformation -); - + OUT PUSBD_VERSION_INFORMATION VersionInformation); DECLSPEC_IMPORT PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptor( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - IN UCHAR InterfaceNumber, - IN UCHAR AlternateSetting -); + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + IN UCHAR InterfaceNumber, + IN UCHAR AlternateSetting); DECLSPEC_IMPORT PURB NTAPI USBD_CreateConfigurationRequest( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - OUT PUSHORT Siz -); + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + OUT PUSHORT Siz); DECLSPEC_IMPORT PUSB_COMMON_DESCRIPTOR NTAPI USBD_ParseDescriptors( - IN PVOID DescriptorBuffer, - IN ULONG TotalLength, - IN PVOID StartPosition, - IN LONG DescriptorType -); + IN PVOID DescriptorBuffer, + IN ULONG TotalLength, + IN PVOID StartPosition, + IN LONG DescriptorType); DECLSPEC_IMPORT PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptorEx( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - IN PVOID StartPosition, - IN LONG InterfaceNumber, - IN LONG AlternateSetting, - IN LONG InterfaceClass, - IN LONG InterfaceSubClass, - IN LONG InterfaceProtocol -); + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + IN PVOID StartPosition, + IN LONG InterfaceNumber, + IN LONG AlternateSetting, + IN LONG InterfaceClass, + IN LONG InterfaceSubClass, + IN LONG InterfaceProtocol); DECLSPEC_IMPORT PURB NTAPI USBD_CreateConfigurationRequestEx( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList -); + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList); - -DECLSPEC_IMPORT +DECLSPEC_EXPORT ULONG NTAPI USBD_GetInterfaceLength( - IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, - IN PUCHAR BufferEnd -); + IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, + IN PUCHAR BufferEnd); -DECLSPEC_IMPORT +DECLSPEC_EXPORT VOID NTAPI USBD_RegisterHcFilter( - IN PDEVICE_OBJECT DeviceObject, - IN PDEVICE_OBJECT FilterDeviceObject -); + IN PDEVICE_OBJECT DeviceObject, + IN PDEVICE_OBJECT FilterDeviceObject); - - -DECLSPEC_IMPORT +DECLSPEC_EXPORT NTSTATUS NTAPI USBD_GetPdoRegistryParameter( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PVOID Parameter, - IN ULONG ParameterLength, - IN PWSTR KeyName, - IN ULONG KeyNameLength -); + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN OUT PVOID Parameter, + IN ULONG ParameterLength, + IN PWSTR KeyName, + IN ULONG KeyNameLength); -DECLSPEC_IMPORT +DECLSPEC_EXPORT NTSTATUS NTAPI USBD_QueryBusTime( - IN PDEVICE_OBJECT RootHubPdo, - OUT PULONG CurrentFrame -); + IN PDEVICE_OBJECT RootHubPdo, + OUT PULONG CurrentFrame); #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -223,10 +204,9 @@ DECLSPEC_IMPORT ULONG NTAPI USBD_CalculateUsbBandwidth( - IN ULONG MaxPacketSize, - IN UCHAR EndpointType, - IN BOOLEAN LowSpeed -); + IN ULONG MaxPacketSize, + IN UCHAR EndpointType, + IN BOOLEAN LowSpeed); #endif @@ -236,15 +216,11 @@ DECLSPEC_IMPORT USBD_STATUS NTAPI USBD_ValidateConfigurationDescriptor( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc, - IN ULONG BufferLength, - IN USHORT Level, - OUT PUCHAR *Offset, - IN ULONG Tag -); - - -#endif + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc, + IN ULONG BufferLength, + IN USHORT Level, + OUT PUCHAR *Offset, + IN ULONG Tag OPTIONAL); #endif diff --git a/include/ddk/usbprotocoldefs.h b/include/ddk/usbprotocoldefs.h new file mode 100644 index 00000000000..678633fa25b --- /dev/null +++ b/include/ddk/usbprotocoldefs.h @@ -0,0 +1,677 @@ +#pragma once + +#include + +#define USB_UnConnected_Device_Address 0 +#define USB_UNCONNECTED_ADDRESS(address) ( USB_UnConnected_Device_Address == (address)) +#define USB_CONNECTED_ADDRESS(address) ( USB_UnConnected_Device_Address != (address) ) + +#define PID_OUT 1 +#define PID_IN 9 +#define PID_SOF 5 +#define PID_SETUP 13 + +#define PID_DATA0 3 +#define PID_DATA1 11 +#define PID_DATA2 7 +#define PID_MDATA 15 + +#define USB_ACK 2 +#define USB_NAK 10 +#define USB_STALL 14 +#define USB_NYET 6 + +#define USB_PRE 12 +#define USB_ERR 12 +#define USB_SPLIT 8 +#define USB_PING 4 + +#define USB_TIMEOUT 0 + +#define USB_SPEC 0x0200 +#define HID_SPEC 0x0101 + +#define USB_20_SPEC 0x0200 +#define USB_11_SPEC 0x0110 +#define USB_10_SPEC 0x0100 + +#define HID_MAX_PACKET_SIZE0 0x08 +#define MICROSOFT_VENDOR_ID 0x045E +#define HID_DEVICE_RELEASE 0x0100 + +#define HID_MAX_PACKET_SIZE 0x0008 +#define HID_POLLING_INTERVAL 0x0A +#define MAX_POLLING_INTERVAL 0xFF + +#define USB_DEFAULT_KEYBOARD_PRODUCT_ID 0x000B +#define USB_DEFAULT_MOUSE_PRODUCT_ID 0x0040 + +#define DEVICE_DESCRIPTOR 0x01 +#define CONFIGURATION_DESCRIPTOR 0x02 +#define STRING_DESCRIPTOR 0x03 +#define INTERFACE_DESCRIPTOR 0x04 +#define ENDPOINT_DESCRIPTOR 0x05 +#define QUALIFIER_DESCRIPTOR 0x06 +#define OTHER_SPEED_DESCRIPTOR 0x07 +#define INTERFACE_POWER_DESCRIPTOR 0x08 + +#define HID_DESCRIPTOR 0x21 +#define REPORT_DESCRIPTOR 0x22 +#define PHYSICAL_DESCRIPTOR 0x23 +#define HUB_DESCRIPTOR 0x29 + +#define USB_DESCRIPTOR_TYPE_STD 0 +#define USB_DESCRIPTOR_TYPE_CLASS 1 +#define USB_DESCRIPTOR_TYPE_VENDOR 2 +#define USB_DESCRIPTOR_TYPE_RESERVED 3 + +#define DIR_HOST_TO_DEVICE 0 +#define DIR_DEVICE_TO_HOST 1 + +#define TYPE_STANDARD 0 +#define TYPE_CLASS 1 +#define TYPE_VENDOR 2 +#define TYPE_RESERVED 3 + +#define RCPT_DEVICE 0 +#define RCPT_INTERFACE 1 +#define RCPT_ENDPOINT 2 +#define RCPT_OTHER 3 +#define RCPT_PORT 4 +#define RCPT_RPIPE 5 + +#if !defined(MIDL_PASS) +#define USB_MAKE_REQUEST_TYPE(direction, type, recipient) (BYTE)( ((BYTE)direction << 7) | ((BYTE)type << 5) | ((BYTE)recipient & 0x07) ) +#endif + +#define GET_STATUS 0 +#define CLEAR_FEATURE 1 +#define SET_FEATURE 3 +#define SET_ADDRESS 5 +#define GET_DESCRIPTOR 6 +#define SET_DESCRIPTOR 7 +#define GET_CONFIGURATION 8 +#define SET_CONFIGURATION 9 +#define GET_INTERFACE 10 +#define SET_INTERFACE 11 +#define SYNCH_FRAME 12 + +#define USB_BULK_ONLY_MASS_STG_RESET 0xFF +#define USB_BULK_ONLY_MASS_STG_GET_MAX_LUN 0xFE + +#define GET_REPORT 0x01 +#define GET_IDLE 0x02 +#define GET_PROTOCOL 0x03 +#define SET_REPORT 0x09 +#define SET_IDLE 0x0A +#define SET_PROTOCOL 0x0B + +#define ADD_MMC_IE 20 +#define REMOVE_MMC_IE 21 +#define SET_NUM_DNTS 22 +#define SET_CLUSTER_ID 23 +#define SET_DEVICE_INFO 24 +#define GET_TIME 25 +#define SET_STREAM_INDEX 26 +#define SET_WUSB_MAS 27 +#define WUSB_CH_STOP 28 + +#define EXEC_RC_CMD 40 + +#define TIME_ADJ 0x01 +#define TIME_BPST 0x02 +#define TIME_WUSB 0x03 + +#define HID_REPORT_TYPE_INPUT 0x01 +#define HID_REPORT_TYPE_OUTPUT 0x02 +#define HID_REPORT_TYPE_FEATURE 0x03 + +#define HID_PROTOCOL_TYPE_BOOT 0x00 +#define HID_PROTOCOL_TYPE_REPORT 0x01 + +#define HUB_DEVICE_PROTOCOL_1X 0 +#define HUB_DEVICE_PROTOCOL_SINGLE_TT 1 +#define HUB_DEVICE_PROTOCOL_MULTI_TT 2 + +#define HUB_INTERFACE_PROTOCOL_1X 0 +#define HUB_INTERFACE_PROTOCOL_SINGLE_TT 0 +#define HUB_INTERFACE_PROTOCOL_MULTI_TT_IN_SINGLE_TT_MODE 1 +#define HUB_INTERFACE_PROTOCOL_MULTI_TT_IN_MULTI_TT_MODE 2 + +#define CLEAR_TT_BUFFER 8 +#define RESET_TT 9 +#define GET_TT_STATE 10 +#define STOP_TT 11 + +#define C_HUB_LOCAL_POWER 0 +#define C_HUB_OVER_CURRENT 1 +#define PORT_CONNECTION 0 +#define PORT_ENABLE 1 +#define PORT_SUSPEND 2 +#define PORT_OVER_CURRENT 3 +#define PORT_RESET 4 +#define PORT_POWER 8 +#define PORT_LOW_SPEED 9 +#define C_PORT_CONNECTION 16 +#define C_PORT_ENABLE 17 +#define C_PORT_SUSPEND 18 +#define C_PORT_OVER_CURRENT 19 +#define C_PORT_RESET 20 +#define PORT_TEST 21 +#define PORT_INDICATOR 22 + +#define USBSETUPSIZE 8 +#define USBINREQUEST 128 + +#define BM_GET_DEVICE 128 +#define BM_GET_INTERFACE 129 +#define BM_GET_ENDPOINT 130 + +#define BM_SET_DEVICE 0 +#define BM_SET_INTERFACE 1 +#define BM_SET_ENDPOINT 2 + +#define HALT_ENDPOINT 0 +#define REMOTE_WAKEUP 1 +#define TEST_MODE 2 + +#define DEVICE_DESCRIPTION_TYPE 0x100 +#define QUALIFIER_DESCRIPTION_TYPE 0x600 +#define OTHER_SPEED_DESCRIPTION_TYPE 0x700 +#define CONFIG_DESCRIPTION_TYPE 0x200 +#define STRING_DESCRIPTION_TYPE 0x300 +#define MSOS_DESCRIPTION_TYPE 0x3EE + +#define CONFIG_BUS_POWERED 0x80 +#define CONFIG_SELF_POWERED 0x40 +#define CONFIG_REMOTE_WAKEUP 0x20 + +#define USB_WA_MULTIFUNCTION 0x02 +#define USB_WA_PROTOCOL 0x01 +#define USB_RADIO_CONTROL 0x2 + +#define USB_HID_CLASS_CODE 0x03 +#define USB_MASS_STORAGE_CLASS_CODE 0x08 +#define USB_HUB_CLASS_CODE 0x09 +#define USB_MISCELLANEOUS 0xEF +#define USB_WIRELESS_WA 0xE0 + +#define BOOT_INTERFACE_SUBCLASS 0x01 +#define COMMON_CLASS 0x02 +#define USB_RF_CONTROL 0x01 + +#define PROTOCOL_NONE 0x00 +#define PROTOCOL_KEYBOARD 0x01 +#define PROTOCOL_MOUSE 0x02 + +#define EP_OUT 0 +#define EP_IN 1 + +#define MAKE_ENDPOINT_ADDRESS(num, dir) ( ((BYTE)(dir) << 7) | ((BYTE)(num) & 0x0F) ) + +#define ENDPOINT_TYPE 0x03 +#define CONTROL_ENDPOINT 0 +#define ISOCHRONOUS_ENDPOINT 1 +#define BULK_ENDPOINT 2 +#define INTERRUPT_ENDPOINT 3 + +typedef union _USBDESCRIPTORTYPE { + BYTE Byte; +#if !defined(MIDL_PASS) + struct Bits { + BYTE Descriptor:5; + BYTE Type:2; + BYTE Reserved:1; + } Bits; +#endif +} USBDESCRIPTORTYPE; + +typedef union _USBCONFIGATTRIBS { + BYTE Byte; +#if !defined(MIDL_PASS) + struct Bits { + BYTE bReserved0_4:5; + BYTE bRemoteWakeup:1; + BYTE bSelfPowered:1; + BYTE bReserved7:1; + } Bits; +#endif +} USBCONFIGATTRIBS; + +typedef union _USBREQUESTTYPE { + BYTE Byte; +#if !defined(MIDL_PASS) + struct Bits { + BYTE Recipient:5; + BYTE Type:2; + BYTE Direction:1; + } Bits; +#endif +} USBREQUESTTYPE; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBREQUESTTYPE) == sizeof(BYTE))); +#endif + +typedef struct _USBSETUPREQUEST { + USBREQUESTTYPE bmRequestType; + BYTE bRequest; + SHORT sSetupValue; + SHORT sSetupIndex; + SHORT sSetupLength; +} USBSETUPREQUEST; + +#if !defined(MIDL_PASS) + +typedef struct _USBDEVICEDESC { + BYTE bLength; + BYTE bDescriptorType; + USHORT usUSB; + BYTE bDeviceClass; + BYTE bDeviceSubClass; + BYTE bProtocol; + BYTE bMaxPacket0; + USHORT usVendor; + USHORT usProduct; + USHORT usDeviceNumber; + BYTE bManufacturer; + BYTE bProductDesc; + BYTE bSerialNumber; + BYTE bNumConfigs; +} USBDEVICEDESC; + +typedef struct _USBCONFIGDESC { + BYTE bLength; + BYTE bDescriptorType; + USHORT usTotalLength; + BYTE bNumInterfaces; + BYTE bConfigValue; + BYTE bConfig; + BYTE bAttributes; + BYTE bMaxPower; +} USBCONFIGDESC; + + +typedef struct _USBINTERFACEDESC { + BYTE bLength; + BYTE bDescriptorType; + BYTE bInterfaceNumber; + BYTE bAlternateSetting; + BYTE bNumEndpoints; + BYTE bClass; + BYTE bSubClass; + BYTE bProtocol; + BYTE bDescription; +} USBINTERFACEDESC; + +#define ENDPOINT_DIRECTION_OUT 0 +#define ENDPOINT_DIRECTION_IN 1 + +typedef union _USBENDPOINTADDRESS { + BYTE Byte; + struct Bits { + BYTE Number:4; + BYTE Reserved:3; + BYTE Direction:1; + } Bits; +} USBENDPOINTADDRESS; + +C_ASSERT((sizeof(USBENDPOINTADDRESS) == sizeof(BYTE))); + +#define USB_TRANSFER_TYPE_CONTROL 0 +#define USB_TRANSFER_TYPE_ISOCH 1 +#define USB_TRANSFER_TYPE_BULK 2 +#define USB_TRANSFER_TYPE_INTERRUPT 3 + +#define USB_SYNC_TYPE_NONE 0 +#define USB_SYNC_TYPE_ASYNC 1 +#define USB_SYNC_TYPE_ADAPTIVE 2 +#define USB_SYNC_TYPE_SYNC 3 + +#define USB_USAGE_TYPE_DATA 0 +#define USB_USAGE_TYPE_FEEDBACK 1 +#define USB_USAGE_TYPE_IMPLICIT 2 +#define USB_USAGE_TYPE_RESERVED 3 + +typedef union _USBENDPOINTATTRIBS { + BYTE Byte; + struct Bits { + BYTE TransferType:2; + BYTE SyncType:2; + BYTE UsageType:2; + BYTE Reserved:2; + } Bits; +} USBENDPOINTATTRIBS; + +C_ASSERT((sizeof(USBENDPOINTATTRIBS) == sizeof(BYTE))); + +typedef union _USBMAXPACKET { + WORD Word; + struct Bits { + WORD Size:11; + WORD AdditionalXactions:2; + WORD Reserved:3; + } Bits; +} USBMAXPACKET; + +C_ASSERT((sizeof(USBMAXPACKET) == sizeof(WORD))); + +typedef struct _USBENDPOINTDESC { + BYTE bLength; + BYTE bDescriptorType; + USBENDPOINTADDRESS Address; + USBENDPOINTATTRIBS Attributes; + USBMAXPACKET MaxPacket; + BYTE bInterval; +} USBENDPOINTDESC; + +typedef struct _USBQUALIFIERDESC { + BYTE bLength; + BYTE bDescriptorType; + USHORT usUSB; + BYTE bDeviceClass; + BYTE bDeviceSubClass; + BYTE bProtocol; + BYTE bMaxPacket; + BYTE bNumConfigs; + BYTE bReserved; +} USBQUALIFIERDESC; + +typedef struct _USBSTRINGDESC { + BYTE bLength; + BYTE bDescriptorType; + WCHAR wchData[1]; +} USBSTRINGDESC; + +typedef struct _USBSTRINGLANGIDS { + BYTE bLength; + BYTE bDescriptorType; + WORD wLANGIDs[1]; +} USBSTRINGLANGIDS; + +typedef struct _USBHIDSTANDARDDESC { + BYTE bLength; + BYTE bDescriptorType; + USHORT bcdHID; + BYTE bCountryCode; + BYTE bNumDescriptors; +} USBHIDSTANDARDDESC; + +typedef struct _USBHIDOPTIONALDESC { + BYTE bClassDescriptorType; + USHORT usDescriptorLength; +} USBHIDOPTIONALDESC; + +typedef struct _USBPHYSICALDESCSET0 { + BYTE bNumber; + BYTE bLength; +} USBPHYSICALDESCSET0; + +typedef union _USBPHYSICALDESCSET { + BYTE bPhysicalInfo; + struct Bits { + BYTE bPreference:5; + BYTE bBias:3; + } Bits; +} USBPHYSICALDESCSET; + +typedef struct _USBPHYSICALDESCITEM { + BYTE bDesignator; + union Flags { + BYTE bFlags; + struct Bits { + BYTE bEffort:5; + BYTE bQualifier:3; + } Bits; + } Flags; +} USBPHYSICALDESCITEM; + +typedef union _USBHUBCHARACTERISTICS { + WORD wHubCharacteristics; + struct Bits { + BYTE bLogicalPowerSwitchingMode:2; + BYTE fCompoundDevice:1; + BYTE bOverCurrentMode:2; + BYTE bTTThinkTime:2; + BYTE fPortIndicatorSupport:1; + BYTE bReserved:8; + } Bits; +} USBHUBCHARACTERISTICS; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBHUBCHARACTERISTICS) == sizeof(WORD))); +#endif + +typedef struct _USBHUBDESC { + BYTE bLength; + BYTE bDescriptorType; + BYTE bNumberOfPorts; + USBHUBCHARACTERISTICS Characteristics; + BYTE bPwrOn2PwrGood; + BYTE bHubContrCurrent; + BYTE bDeviceRemovable[32]; + BYTE bPortPwrCtrlMask[32]; +} USBHUBDESC; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBHUBDESC) == 71)); +#endif + +typedef union _USBHUBPORTSTATUS { + WORD wPortStatus; + struct Bits { + BYTE fCurrentConnectionStatus:1; + BYTE fEnabled:1; + BYTE fSuspend:1; + BYTE fOverCurrent:1; + BYTE fReset:1; + BYTE bReserved1:3; + BYTE fPortPower:1; + BYTE fLowSpeedDevice:1; + BYTE fHighSpeedDevice:1; + BYTE fTestMode:1; + BYTE fPortIndicatorControl:1; + BYTE bReserved2:3; + } Bits; +} USBHUBPORTSTATUS; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBHUBPORTSTATUS) == sizeof(WORD))); +#endif + +typedef union _USBHUBPORTSTATUSCHANGE { + WORD wPortStatusChange; + struct Bits { + BYTE fConnectionStatusChange:1; + BYTE fEnabledChange:1; + BYTE fSuspendChange:1; + BYTE fOverCurrentChange:1; + BYTE fResetChange:1; + BYTE bReserved1:3; + BYTE bReserved2:8; + } Bits; +} USBHUBPORTSTATUSCHANGE; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBHUBPORTSTATUSCHANGE) == sizeof(WORD))); +#endif + +typedef struct _USBHUBPORTDATA { + USBHUBPORTSTATUS PortStatus; + USBHUBPORTSTATUSCHANGE PortStatusChange; +} USBHUBPORTDATA; + +#define USB_MAKE_LANGID(lang, sublang) ((((USHORT)(sublang)) << 10) | (USHORT)(lang)) + +#define USB_LANG_RESERVED 0x00 +#define USB_LANG_ARABIC 0x01 +#define USB_LANG_BULGARIAN 0x02 +#define USB_LANG_CATALAN 0x03 +#define USB_LANG_CHINESE 0x04 +#define USB_LANG_CZECH 0x05 +#define USB_LANG_DANISH 0x06 +#define USB_LANG_GERMAN 0x07 +#define USB_LANG_GREEK 0x08 +#define USB_LANG_ENGLISH 0x09 +#define USB_LANG_SPANISH 0x0a +#define USB_LANG_FINNISH 0x0b +#define USB_LANG_FRENCH 0x0c +#define USB_LANG_HEBREW 0x0d +#define USB_LANG_HUNGARIAN 0x0e +#define USB_LANG_ICELANDIC 0x0f +#define USB_LANG_ITALIAN 0x10 +#define USB_LANG_JAPANESE 0x11 +#define USB_LANG_KOREAN 0x12 +#define USB_LANG_DUTCH 0x13 +#define USB_LANG_NORWEGIAN 0x14 +#define USB_LANG_POLISH 0x15 +#define USB_LANG_PORTUGUESE 0x16 +#define USB_LANG_ROMANIAN 0x18 +#define USB_LANG_RUSSIAN 0x19 +#define USB_LANG_CROATIAN 0x1a +#define USB_LANG_SERBIAN 0x1a +#define USB_LANG_SLOVAK 0x1b +#define USB_LANG_ALBANIAN 0x1c +#define USB_LANG_SWEDISH 0x1d +#define USB_LANG_THAI 0x1e +#define USB_LANG_TURKISH 0x1f +#define USB_LANG_URDU 0x20 +#define USB_LANG_INDONESIAN 0x21 +#define USB_LANG_UKRANIAN 0x22 +#define USB_LANG_BELARUSIAN 0x23 +#define USB_LANG_SLOVENIAN 0x24 +#define USB_LANG_ESTONIAN 0x25 +#define USB_LANG_LATVIAN 0x26 +#define USB_LANG_LITHUANIAN 0x27 +#define USB_LANG_FARSI 0x29 +#define USB_LANG_VIETNAMESE 0x2a +#define USB_LANG_ARMENIAN 0x2b +#define USB_LANG_AZERI 0x2c +#define USB_LANG_BASQUE 0x2d +#define USB_LANG_MACEDONIAN 0x2f +#define USB_LANG_AFRIKAANS 0x36 +#define USB_LANG_GEORGIAN 0x37 +#define USB_LANG_FAEROESE 0x38 +#define USB_LANG_HINDI 0x39 +#define USB_LANG_MALAY 0x3e +#define USB_LANG_KAZAK 0x3f +#define USB_LANG_SWAHILI 0x41 +#define USB_LANG_UZBEK 0x43 +#define USB_LANG_TATAR 0x44 +#define USB_LANG_BENGALI 0x45 +#define USB_LANG_PUNJABI 0x46 +#define USB_LANG_GUJARATI 0x47 +#define USB_LANG_ORIYA 0x48 +#define USB_LANG_TAMIL 0x49 +#define USB_LANG_TELUGU 0x4a +#define USB_LANG_KANNADA 0x4b +#define USB_LANG_MALAYALAM 0x4c +#define USB_LANG_ASSAMESE 0x4d +#define USB_LANG_MARATHI 0x4e +#define USB_LANG_SANSKRIT 0x4f +#define USB_LANG_KONKANI 0x57 +#define USB_LANG_MANIPURI 0x58 +#define USB_LANG_SINDHI 0x59 +#define USB_LANG_KASHMIRI 0x60 +#define USB_LANG_NEPALI 0x61 +#define USB_LANG_HID 0xff + +#define USB_SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +#define USB_SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +#define USB_SUBLANG_ARABIC_IRAQ 0x02 +#define USB_SUBLANG_ARABIC_EGYPT 0x03 +#define USB_SUBLANG_ARABIC_LIBYA 0x04 +#define USB_SUBLANG_ARABIC_ALGERIA 0x05 +#define USB_SUBLANG_ARABIC_MOROCCO 0x06 +#define USB_SUBLANG_ARABIC_TUNISIA 0x07 +#define USB_SUBLANG_ARABIC_OMAN 0x08 +#define USB_SUBLANG_ARABIC_YEMEN 0x09 +#define USB_SUBLANG_ARABIC_SYRIA 0x10 +#define USB_SUBLANG_ARABIC_JORDAN 0x11 +#define USB_SUBLANG_ARABIC_LEBANON 0x12 +#define USB_SUBLANG_ARABIC_KUWAIT 0x13 +#define USB_SUBLANG_ARABIC_UAE 0x14 +#define USB_SUBLANG_ARABIC_BAHRAIN 0x15 +#define USB_SUBLANG_ARABIC_QATAR 0x16 +#define USB_SUBLANG_AZERI_CYRILLIC 0x01 +#define USB_SUBLANG_AZERI_LATIN 0x02 +#define USB_SUBLANG_CHINESE_TRADITIONAL 0x01 +#define USB_SUBLANG_CHINESE_SIMPLIFIED 0x02 +#define USB_SUBLANG_CHINESE_HONGKONG 0x03 +#define USB_SUBLANG_CHINESE_SINGAPORE 0x04 +#define USB_SUBLANG_CHINESE_MACAU 0x05 +#define USB_SUBLANG_DUTCH 0x01 +#define USB_SUBLANG_DUTCH_BELGIAN 0x02 +#define USB_SUBLANG_ENGLISH_US 0x01 +#define USB_SUBLANG_ENGLISH_UK 0x02 +#define USB_SUBLANG_ENGLISH_AUS 0x03 +#define USB_SUBLANG_ENGLISH_CAN 0x04 +#define USB_SUBLANG_ENGLISH_NZ 0x05 +#define USB_SUBLANG_ENGLISH_EIRE 0x06 +#define USB_SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 +#define USB_SUBLANG_ENGLISH_JAMAICA 0x08 +#define USB_SUBLANG_ENGLISH_CARIBBEAN 0x09 +#define USB_SUBLANG_ENGLISH_BELIZE 0x0a +#define USB_SUBLANG_ENGLISH_TRINIDAD 0x0b +#define USB_SUBLANG_ENGLISH_PHILIPPINES 0x0c +#define USB_SUBLANG_ENGLISH_ZIMBABWE 0x0d +#define USB_SUBLANG_FRENCH 0x01 +#define USB_SUBLANG_FRENCH_BELGIAN 0x02 +#define USB_SUBLANG_FRENCH_CANADIAN 0x03 +#define USB_SUBLANG_FRENCH_SWISS 0x04 +#define USB_SUBLANG_FRENCH_LUXEMBOURG 0x05 +#define USB_SUBLANG_FRENCH_MONACO 0x06 +#define USB_SUBLANG_GERMAN 0x01 +#define USB_SUBLANG_GERMAN_SWISS 0x02 +#define USB_SUBLANG_GERMAN_AUSTRIAN 0x03 +#define USB_SUBLANG_GERMAN_LUXEMBOURG 0x04 +#define USB_SUBLANG_GERMAN_LIECHTENSTEIN 0x05 +#define USB_SUBLANG_ITALIAN 0x01 +#define USB_SUBLANG_ITALIAN_SWISS 0x02 +#define USB_SUBLANG_KASHMIRI_INDIA 0x02 +#define USB_SUBLANG_KOREAN 0x01 +#define USB_SUBLANG_LITHUANIAN 0x01 +#define USB_SUBLANG_MALAY_MALAYSIA 0x01 +#define USB_SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 +#define USB_SUBLANG_NEPALI_INDIA 0x02 +#define USB_SUBLANG_NORWEGIAN_BOKMAL 0x01 +#define USB_SUBLANG_NORWEGIAN_NYNORSK 0x02 +#define USB_SUBLANG_PORTUGUESE 0x01 +#define USB_SUBLANG_PORTUGUESE_BRAZILIAN 0x02 +#define USB_SUBLANG_SERBIAN_LATIN 0x02 +#define USB_SUBLANG_SERBIAN_CYRILLIC 0x03 +#define USB_SUBLANG_SPANISH 0x01 +#define USB_SUBLANG_SPANISH_MEXICAN 0x02 +#define USB_SUBLANG_SPANISH_MODERN 0x03 +#define USB_SUBLANG_SPANISH_GUATEMALA 0x04 +#define USB_SUBLANG_SPANISH_COSTA_RICA 0x05 +#define USB_SUBLANG_SPANISH_PANAMA 0x06 +#define USB_SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 +#define USB_SUBLANG_SPANISH_VENEZUELA 0x08 +#define USB_SUBLANG_SPANISH_COLOMBIA 0x09 +#define USB_SUBLANG_SPANISH_PERU 0x0a +#define USB_SUBLANG_SPANISH_ARGENTINA 0x0b +#define USB_SUBLANG_SPANISH_ECUADOR 0x0c +#define USB_SUBLANG_SPANISH_CHILE 0x0d +#define USB_SUBLANG_SPANISH_URUGUAY 0x0e +#define USB_SUBLANG_SPANISH_PARAGUAY 0x0f +#define USB_SUBLANG_SPANISH_BOLIVIA 0x10 +#define USB_SUBLANG_SPANISH_EL_SALVADOR 0x11 +#define USB_SUBLANG_SPANISH_HONDURAS 0x12 +#define USB_SUBLANG_SPANISH_NICARAGUA 0x13 +#define USB_SUBLANG_SPANISH_PUERTO_RICO 0x14 +#define USB_SUBLANG_SWEDISH 0x01 +#define USB_SUBLANG_SWEDISH_FINLAND 0x02 +#define USB_SUBLANG_URDU_PAKISTAN 0x01 +#define USB_SUBLANG_URDU_INDIA 0x02 +#define USB_SUBLANG_UZBEK_LATIN 0x01 +#define USB_SUBLANG_UZBEK_CYRILLIC 0x02 +#define USB_SUBLANG_HID_USAGE_DATA_DESCRIPTOR 0x01 +#define USB_SUBLANG_HID_VENDOR_DEFINED_1 0x3c +#define USB_SUBLANG_HID_VENDOR_DEFINED_2 0x3d +#define USB_SUBLANG_HID_VENDOR_DEFINED_3 0x3e +#define USB_SUBLANG_HID_VENDOR_DEFINED_4 0x3f + +#endif // !defined(MIDL_PASS) + +#include diff --git a/include/ddk/usbscan.h b/include/ddk/usbscan.h index 8e61a7a736b..ffe884ee62b 100644 --- a/include/ddk/usbscan.h +++ b/include/ddk/usbscan.h @@ -20,21 +20,33 @@ * */ -#ifndef __USBSCAN_H -#define __USBSCAN_H +#pragma once #ifdef __cplusplus extern "C" { #endif +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +#pragma pack(push,8) + #define FILE_DEVICE_USB_SCAN 0x8000 #define IOCTL_INDEX 0x0800 +#define IOCTL_GET_VERSION \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 0, METHOD_BUFFERED,FILE_ANY_ACCESS) + #define IOCTL_CANCEL_IO \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 1, METHOD_BUFFERED,FILE_ANY_ACCESS) -#define IOCTL_GET_VERSION \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 0, METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_WAIT_ON_DEVICE_EVENT \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 2, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_READ_REGISTERS \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 3, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_WRITE_REGISTERS \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 4, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_GET_CHANNEL_ALIGN_RQST \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 5, METHOD_BUFFERED,FILE_ANY_ACCESS) @@ -42,32 +54,26 @@ extern "C" { #define IOCTL_GET_DEVICE_DESCRIPTOR \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 6, METHOD_BUFFERED,FILE_ANY_ACCESS) -#define IOCTL_GET_PIPE_CONFIGURATION \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 10,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_RESET_PIPE \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 7, METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_GET_USB_DESCRIPTOR \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 8, METHOD_BUFFERED,FILE_ANY_ACCESS) -#define IOCTL_READ_REGISTERS \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 3, METHOD_BUFFERED,FILE_ANY_ACCESS) - -#define IOCTL_RESET_PIPE \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 7, METHOD_BUFFERED,FILE_ANY_ACCESS) - #define IOCTL_SEND_USB_REQUEST \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 9, METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_GET_PIPE_CONFIGURATION \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 10,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#if (NTDDI_VERSION >= NTDDI_WINXP) #define IOCTL_SET_TIMEOUT \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 11,METHOD_BUFFERED,FILE_ANY_ACCESS) +#endif -#define IOCTL_WAIT_ON_DEVICE_EVENT \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 2, METHOD_BUFFERED,FILE_ANY_ACCESS) - -#define IOCTL_WRITE_REGISTERS \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 4, METHOD_BUFFERED, FILE_ANY_ACCESS) - - +#ifndef MAX_NUM_PIPES #define MAX_NUM_PIPES 8 +#endif #define BULKIN_FLAG 0x80 @@ -114,10 +120,10 @@ typedef struct _USBSCAN_GET_DESCRIPTOR { } USBSCAN_GET_DESCRIPTOR, *PUSBSCAN_GET_DESCRIPTOR; typedef enum _RAW_PIPE_TYPE { - USBSCAN_PIPE_CONTROL, - USBSCAN_PIPE_ISOCHRONOUS, - USBSCAN_PIPE_BULK, - USBSCAN_PIPE_INTERRUPT + USBSCAN_PIPE_CONTROL, + USBSCAN_PIPE_ISOCHRONOUS, + USBSCAN_PIPE_BULK, + USBSCAN_PIPE_INTERRUPT } RAW_PIPE_TYPE; typedef struct _USBSCAN_PIPE_INFORMATION { @@ -132,21 +138,25 @@ typedef struct _USBSCAN_PIPE_CONFIGURATION { OUT USBSCAN_PIPE_INFORMATION PipeInfo[MAX_NUM_PIPES]; } USBSCAN_PIPE_CONFIGURATION, *PUSBSCAN_PIPE_CONFIGURATION; +#if (NTDDI_VERSION >= NTDDI_WINXP) typedef struct _USBSCAN_TIMEOUT { IN ULONG TimeoutRead; IN ULONG TimeoutWrite; IN ULONG TimeoutEvent; } USBSCAN_TIMEOUT, *PUSBSCAN_TIMEOUT; +#endif typedef enum _PIPE_TYPE { - EVENT_PIPE, - READ_DATA_PIPE, - WRITE_DATA_PIPE, - ALL_PIPE + EVENT_PIPE, + READ_DATA_PIPE, + WRITE_DATA_PIPE, + ALL_PIPE } PIPE_TYPE; +#pragma pack(pop) + +#endif // (NTDDI_VERSION >= NTDDI_WIN2K) + #ifdef __cplusplus } #endif - -#endif /* __USBSCAN_H */ diff --git a/include/ddk/usbstorioctl.h b/include/ddk/usbstorioctl.h new file mode 100644 index 00000000000..bb0c4d1774b --- /dev/null +++ b/include/ddk/usbstorioctl.h @@ -0,0 +1,64 @@ +#pragma once + +#ifndef MAX_PATH +#define MAX_PATH 260 +#endif + +#define SIZE_ENUM_PDO_RESULTS_HEADER (sizeof(ENUM_PDO_RESULTS) - sizeof(ENUM_PDO_ENTRY)) + +#define IOCTL_EHSTOR_DEVICE_SET_AUTHZ_STATE CTL_CODE(IOCTL_STORAGE_BASE, 0x501, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_EHSTOR_DEVICE_GET_AUTHZ_STATE CTL_CODE(IOCTL_STORAGE_BASE, 0x502, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_EHSTOR_DEVICE_SILO_COMMAND CTL_CODE(IOCTL_STORAGE_BASE, 0x503, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS CTL_CODE(IOCTL_STORAGE_BASE, 0x504, METHOD_BUFFERED, FILE_ANY_ACCESS) + +DEFINE_GUID(GUID_USBSTOR_EHSTOR_SILO_INTERFACE, 0x7c2bcf57, 0x2bea, 0x46da, 0xad, 0x26, 0x78, 0xfd, 0xc8, 0x3c, 0xee, 0x46); +DEFINE_GUID(GUID_USBSTOR_EHSTOR_CONTROL_INTERFACE, 0x4f40006f, 0xb933, 0x4550, 0xb5, 0x32, 0x2b, 0x58, 0xce, 0xe6, 0x14, 0xd3); + +typedef struct tagACT_AUTHZ_STATE { + UCHAR ACT; + BOOLEAN fAuthorized; +} ACT_AUTHZ_STATE, *PACT_AUTHZ_STATE; + +typedef struct tagSILO_COMMAND { + UCHAR SiloIndex; + UCHAR Command; + ULONG cbCommandBuffer; + UCHAR rgbCommandBuffer[ANYSIZE_ARRAY]; +} SILO_COMMAND, *PSILO_COMMAND; + +typedef enum _PDO_TYPE { + PDO_TYPE_UNDEFINED = 0, + PDO_TYPE_DISK, + PDO_TYPE_CONTROL, + PDO_TYPE_SILO, + PDO_TYPE_THIS = 256 +} PDO_TYPE; + +typedef enum _PDO_STATE { + PDO_STATE_UNDEFINED = 0, + PDO_STATE_STARTED, + PDO_STATE_NOT_STARTED +} PDO_STATE; + +typedef enum _PDO_CAPS { + PDO_CAPABILITY_UNDEFINED = 0, + PDO_CAPABILITY_INC512_SET = 1, + PDO_CAPABILITY_INC512_CLEAR = 2 +} PDO_CAPS; + +typedef struct _ENUM_PDO_ENTRY { + UCHAR type; + UCHAR state; + UCHAR capabilities; + ULONG ulSTID; + UCHAR bSpecificationMajor; + UCHAR bSpecificationMinor; + UCHAR bImplementationMajor; + UCHAR bImplementationMinor; + WCHAR wszDeviceInstancePath[(2 * MAX_PATH) + 1]; +} ENUM_PDO_ENTRY, *PENUM_PDO_ENTRY; + +typedef struct _ENUM_PDO_RESULTS { + ULONG cEntries; + ENUM_PDO_ENTRY rgEntries[ANYSIZE_ARRAY]; +} ENUM_PDO_RESULTS, *PENUM_PDO_RESULTS;