More work on USB related definitions
authorAmine Khaldi <amine.khaldi@reactos.org>
Thu, 4 Mar 2010 22:58:41 +0000 (22:58 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Thu, 4 Mar 2010 22:58:41 +0000 (22:58 +0000)
svn path=/branches/header-work/; revision=45846

include/ddk/usbbusif.h
include/ddk/usbdlib.h
include/ddk/usbprotocoldefs.h [new file with mode: 0644]
include/ddk/usbscan.h
include/ddk/usbstorioctl.h [new file with mode: 0644]

index 77b22ee..0483738 100644 (file)
@@ -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);
index 3bb214b..7f21da6 100644 (file)
@@ -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 (file)
index 0000000..678633f
--- /dev/null
@@ -0,0 +1,677 @@
+#pragma once
+
+#include <PSHPACK1.h>
+
+#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 <POPPACK.h>
index 8e61a7a..ffe884e 100644 (file)
  *
  */
 
-#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 (file)
index 0000000..bb0c4d1
--- /dev/null
@@ -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;