|  | /* | 
|  | * usbioctl.h | 
|  | * | 
|  | * USB IOCTL interface. | 
|  | * | 
|  | * This file is part of the ReactOS PSDK package. | 
|  | * | 
|  | * Contributors: | 
|  | *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net> | 
|  | * | 
|  | * THIS SOFTWARE IS NOT COPYRIGHTED | 
|  | * | 
|  | * This source code is offered for use in the public domain. You may | 
|  | * use, modify or distribute it freely. | 
|  | * | 
|  | * This code is distributed in the hope that it will be useful but | 
|  | * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY | 
|  | * DISCLAIMED. This includes but is not limited to warranties of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #include "usb100.h" | 
|  | #include "usbiodef.h" | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_SUBMIT_URB  \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_SUBMIT_URB, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_RESET_PORT \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_RESET_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_ROOTHUB_PDO, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define USBD_PORT_ENABLED                 1 | 
|  | #define USBD_PORT_CONNECTED               2 | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_PORT_STATUS \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_PORT_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_ENABLE_PORT \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_ENABLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_HUB_COUNT \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_COUNT, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_CYCLE_PORT \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_CYCLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_HUB_NAME \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_BUS_INFO \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_BUS_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_CONTROLLER_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_BUSGUID_INFO \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_BUSGUID_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_PARENT_HUB_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #if (_WIN32_WINNT >= 0x0501) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #endif | 
|  |  | 
|  | #if (_WIN32_WINNT >= 0x0600) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_NOTIFY_IDLE_READY \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION_EX, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_REQ_GLOBAL_SUSPEND \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_REQ_GLOBAL_SUSPEND, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_REQ_GLOBAL_RESUME \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_REQ_GLOBAL_RESUME, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #ifdef USB20_API | 
|  | typedef struct _USB_START_FAILDATA { | 
|  | ULONG LengthInBytes; | 
|  | NTSTATUS NtStatus; | 
|  | USBD_STATUS UsbdStatus; | 
|  | ULONG ConnectStatus; | 
|  | UCHAR DriverData[4]; | 
|  | } USB_START_FAILDATA, *PUSB_START_FAILDATA; | 
|  | #endif | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_RECORD_FAILURE \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_RECORD_FAILURE, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE_EX \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE_EX, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_TT_DEVICE_HANDLE \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_TT_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | typedef struct _USB_TOPOLOGY_ADDRESS { | 
|  | ULONG PciBusNumber; | 
|  | ULONG PciDeviceNumber; | 
|  | ULONG PciFunctionNumber; | 
|  | ULONG Reserved; | 
|  | USHORT RootHubPortNumber; | 
|  | USHORT HubPortNumber[5]; | 
|  | USHORT Reserved2; | 
|  | } USB_TOPOLOGY_ADDRESS, *PUSB_TOPOLOGY_ADDRESS; | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_TOPOLOGY_ADDRESS \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_TOPOLOGY_ADDRESS, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_INTERNAL_USB_GET_DEVICE_CONFIG_INFO \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CONFIG_INFO, METHOD_NEITHER, FILE_ANY_ACCESS) | 
|  |  | 
|  | #endif /* _WIN32_WINNT >= 0x0600 */ | 
|  |  | 
|  | #ifndef USB_KERNEL_IOCTL | 
|  |  | 
|  | #define IOCTL_USB_HCD_GET_STATS_1 \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_1, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_HCD_GET_STATS_2 \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_2, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_HCD_DISABLE_PORT \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_HCD_ENABLE_PORT \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_HCD_DISABLE_PORT \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_HCD_ENABLE_PORT \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #ifndef IOCTL_USB_DIAGNOSTIC_MODE_OFF | 
|  | #define IOCTL_USB_DIAGNOSTIC_MODE_OFF \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  | #endif | 
|  |  | 
|  | #ifndef IOCTL_USB_DIAGNOSTIC_MODE_ON | 
|  | #define IOCTL_USB_DIAGNOSTIC_MODE_ON \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  | #endif | 
|  |  | 
|  | #ifndef IOCTL_USB_GET_ROOT_HUB_NAME | 
|  | #define IOCTL_USB_GET_ROOT_HUB_NAME \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  | #endif | 
|  |  | 
|  | #ifndef IOCTL_GET_HCD_DRIVERKEY_NAME | 
|  | #define IOCTL_GET_HCD_DRIVERKEY_NAME \ | 
|  | CTL_CODE(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  | #endif | 
|  |  | 
|  | #define IOCTL_USB_GET_NODE_INFORMATION \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_GET_NODE_CONNECTION_NAME \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_DIAG_IGNORE_HUBS_ON \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_DIAG_IGNORE_HUBS_OFF \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #if (_WIN32_WINNT >= 0x0501) | 
|  |  | 
|  | #define IOCTL_USB_GET_HUB_CAPABILITIES \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_HUB_CYCLE_PORT \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_HUB_CYCLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #endif /* _WIN32_WINNT >= 0x0501 */ | 
|  |  | 
|  | #if (_WIN32_WINNT >= 0x0600) | 
|  |  | 
|  | #define IOCTL_USB_RESET_HUB \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_RESET_HUB, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #define IOCTL_USB_GET_HUB_CAPABILITIES_EX \ | 
|  | CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) | 
|  |  | 
|  | #endif /* _WIN32_WINNT >= 0x0600 */ | 
|  |  | 
|  | #include <pshpack1.h> | 
|  |  | 
|  | typedef enum _USB_HUB_NODE { | 
|  | UsbHub, | 
|  | UsbMIParent | 
|  | } USB_HUB_NODE; | 
|  |  | 
|  | typedef struct _USB_HUB_INFORMATION { | 
|  | USB_HUB_DESCRIPTOR HubDescriptor; | 
|  | BOOLEAN HubIsBusPowered; | 
|  | } USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; | 
|  |  | 
|  | typedef struct _USB_MI_PARENT_INFORMATION { | 
|  | ULONG NumberOfInterfaces; | 
|  | } USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; | 
|  |  | 
|  | typedef struct _USB_NODE_INFORMATION { | 
|  | USB_HUB_NODE NodeType; | 
|  | union { | 
|  | USB_HUB_INFORMATION HubInformation; | 
|  | USB_MI_PARENT_INFORMATION MiParentInformation; | 
|  | } u; | 
|  | } USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; | 
|  |  | 
|  | typedef struct _USB_PIPE_INFO { | 
|  | USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; | 
|  | ULONG ScheduleOffset; | 
|  | } USB_PIPE_INFO, *PUSB_PIPE_INFO; | 
|  |  | 
|  | #if (_WIN32_WINNT >= 0x0600) | 
|  |  | 
|  | typedef enum _USB_CONNECTION_STATUS { | 
|  | NoDeviceConnected, | 
|  | DeviceConnected, | 
|  | DeviceFailedEnumeration, | 
|  | DeviceGeneralFailure, | 
|  | DeviceCausedOvercurrent, | 
|  | DeviceNotEnoughPower, | 
|  | DeviceNotEnoughBandwidth, | 
|  | DeviceHubNestedTooDeeply, | 
|  | DeviceInLegacyHub, | 
|  | DeviceEnumerating, | 
|  | DeviceReset | 
|  | } USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; | 
|  |  | 
|  | #elif (_WIN32_WINNT >= 0x0501) | 
|  |  | 
|  | typedef enum _USB_CONNECTION_STATUS { | 
|  | NoDeviceConnected, | 
|  | DeviceConnected, | 
|  | DeviceFailedEnumeration, | 
|  | DeviceGeneralFailure, | 
|  | DeviceCausedOvercurrent, | 
|  | DeviceNotEnoughPower, | 
|  | DeviceNotEnoughBandwidth, | 
|  | DeviceHubNestedTooDeeply, | 
|  | DeviceInLegacyHub | 
|  | } USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; | 
|  |  | 
|  | #else /* _WIN32_WINNT >= 0x0501 */ | 
|  |  | 
|  | typedef enum _USB_CONNECTION_STATUS { | 
|  | NoDeviceConnected, | 
|  | DeviceConnected, | 
|  | DeviceFailedEnumeration, | 
|  | DeviceGeneralFailure, | 
|  | DeviceCausedOvercurrent, | 
|  | DeviceNotEnoughPower, | 
|  | DeviceNotEnoughBandwidth | 
|  | } USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; | 
|  |  | 
|  | #endif /* _WIN32_WINNT >= 0x0501 */ | 
|  |  | 
|  | typedef struct _USB_NODE_CONNECTION_INFORMATION { | 
|  | ULONG ConnectionIndex; | 
|  | USB_DEVICE_DESCRIPTOR DeviceDescriptor; | 
|  | UCHAR CurrentConfigurationValue; | 
|  | BOOLEAN LowSpeed; | 
|  | BOOLEAN DeviceIsHub; | 
|  | USHORT DeviceAddress; | 
|  | ULONG NumberOfOpenPipes; | 
|  | USB_CONNECTION_STATUS ConnectionStatus; | 
|  | USB_PIPE_INFO PipeList[0]; | 
|  | } USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION; | 
|  |  | 
|  | typedef struct _USB_NODE_CONNECTION_DRIVERKEY_NAME { | 
|  | ULONG ConnectionIndex; | 
|  | ULONG ActualLength; | 
|  | WCHAR DriverKeyName[1]; | 
|  | } USB_NODE_CONNECTION_DRIVERKEY_NAME, *PUSB_NODE_CONNECTION_DRIVERKEY_NAME; | 
|  |  | 
|  | typedef struct _USB_NODE_CONNECTION_NAME { | 
|  | ULONG ConnectionIndex; | 
|  | ULONG ActualLength; | 
|  | WCHAR NodeName[1]; | 
|  | } USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; | 
|  |  | 
|  | typedef struct _USB_HUB_NAME { | 
|  | ULONG ActualLength; | 
|  | WCHAR HubName[1]; | 
|  | } USB_HUB_NAME, *PUSB_HUB_NAME; | 
|  |  | 
|  | typedef struct _USB_ROOT_HUB_NAME { | 
|  | ULONG ActualLength; | 
|  | WCHAR RootHubName[1]; | 
|  | } USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; | 
|  |  | 
|  | typedef struct _USB_HCD_DRIVERKEY_NAME { | 
|  | ULONG ActualLength; | 
|  | WCHAR DriverKeyName[1]; | 
|  | } USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME; | 
|  |  | 
|  | typedef struct _USB_DESCRIPTOR_REQUEST { | 
|  | ULONG ConnectionIndex; | 
|  | struct { | 
|  | UCHAR bmRequest; | 
|  | UCHAR bRequest; | 
|  | USHORT wValue; | 
|  | USHORT wIndex; | 
|  | USHORT wLength; | 
|  | } SetupPacket; | 
|  | UCHAR Data[0]; | 
|  | } USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; | 
|  |  | 
|  | #if (_WIN32_WINNT >= 0x0501) | 
|  |  | 
|  | typedef struct _USB_HUB_CAPABILITIES { | 
|  | ULONG  HubIs2xCapable:1; | 
|  | } USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; | 
|  |  | 
|  | typedef struct _USB_NODE_CONNECTION_ATTRIBUTES { | 
|  | ULONG ConnectionIndex; | 
|  | USB_CONNECTION_STATUS ConnectionStatus; | 
|  | ULONG PortAttributes; | 
|  | } USB_NODE_CONNECTION_ATTRIBUTES, *PUSB_NODE_CONNECTION_ATTRIBUTES; | 
|  |  | 
|  | typedef struct _USB_NODE_CONNECTION_INFORMATION_EX { | 
|  | ULONG ConnectionIndex; | 
|  | USB_DEVICE_DESCRIPTOR DeviceDescriptor; | 
|  | UCHAR CurrentConfigurationValue; | 
|  | UCHAR Speed; | 
|  | BOOLEAN DeviceIsHub; | 
|  | USHORT DeviceAddress; | 
|  | ULONG NumberOfOpenPipes; | 
|  | USB_CONNECTION_STATUS ConnectionStatus; | 
|  | USB_PIPE_INFO PipeList[0]; | 
|  | } USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX; | 
|  |  | 
|  | C_ASSERT(sizeof(USB_NODE_CONNECTION_INFORMATION_EX) == sizeof(USB_NODE_CONNECTION_INFORMATION)); | 
|  |  | 
|  | #endif /* _WIN32_WINNT >= 0x0501 */ | 
|  |  | 
|  | #if (_WIN32_WINNT >= 0x0600) | 
|  |  | 
|  | typedef union _USB_HUB_CAP_FLAGS { | 
|  | ULONG ul; | 
|  | __C89_NAMELESS struct { | 
|  | ULONG HubIsHighSpeedCapable:1; | 
|  | ULONG HubIsHighSpeed:1; | 
|  | ULONG HubIsMultiTtCapable:1; | 
|  | ULONG HubIsMultiTt:1; | 
|  | ULONG HubIsRoot:1; | 
|  | ULONG HubIsArmedWakeOnConnect:1; | 
|  | ULONG HubIsBusPowered:1; | 
|  | ULONG ReservedMBZ:25; | 
|  | }; | 
|  | } USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS; | 
|  |  | 
|  | C_ASSERT(sizeof(USB_HUB_CAP_FLAGS) == sizeof(ULONG)); | 
|  |  | 
|  | typedef struct _USB_HUB_CAPABILITIES_EX { | 
|  | USB_HUB_CAP_FLAGS CapabilityFlags; | 
|  | } USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX; | 
|  |  | 
|  | typedef struct _USB_CYCLE_PORT_PARAMS { | 
|  | ULONG ConnectionIndex; | 
|  | ULONG StatusReturned; | 
|  | } USB_CYCLE_PORT_PARAMS, *PUSB_CYCLE_PORT_PARAMS; | 
|  |  | 
|  | typedef struct _USB_ID_STRING { | 
|  | USHORT LanguageId; | 
|  | USHORT Pad; | 
|  | ULONG LengthInBytes; | 
|  | PWCHAR Buffer; | 
|  | } USB_ID_STRING, *PUSB_ID_STRING; | 
|  |  | 
|  | typedef struct _USB_HUB_DEVICE_UXD_SETTINGS { | 
|  | ULONG Version; | 
|  | GUID PnpGuid; | 
|  | GUID OwnerGuid; | 
|  | ULONG DeleteOnShutdown; | 
|  | ULONG DeleteOnReload; | 
|  | ULONG DeleteOnDisconnect; | 
|  | ULONG Reserved[5]; | 
|  | } USB_HUB_DEVICE_UXD_SETTINGS, *PUSB_HUB_DEVICE_UXD_SETTINGS; | 
|  |  | 
|  | typedef struct _HUB_DEVICE_CONFIG_INFO_V1 { | 
|  | ULONG Version; | 
|  | ULONG Length; | 
|  | USB_HUB_CAP_FLAGS HubFlags; | 
|  | USB_ID_STRING HardwareIds; | 
|  | USB_ID_STRING CompatibleIds; | 
|  | USB_ID_STRING DeviceDescription; | 
|  | ULONG Reserved[19]; | 
|  | USB_HUB_DEVICE_UXD_SETTINGS UxdSettings; | 
|  | } HUB_DEVICE_CONFIG_INFO, *PHUB_DEVICE_CONFIG_INFO; | 
|  |  | 
|  | #endif /* _WIN32_WINNT >= 0x0600 */ | 
|  |  | 
|  | typedef struct _HCD_ISO_STAT_COUNTERS { | 
|  | USHORT LateUrbs; | 
|  | USHORT DoubleBufferedPackets; | 
|  | USHORT TransfersCF_5ms; | 
|  | USHORT TransfersCF_2ms; | 
|  | USHORT TransfersCF_1ms; | 
|  | USHORT MaxInterruptLatency; | 
|  | USHORT BadStartFrame; | 
|  | USHORT StaleUrbs; | 
|  | USHORT IsoPacketNotAccesed; | 
|  | USHORT IsoPacketHWError; | 
|  | USHORT SmallestUrbPacketCount; | 
|  | USHORT LargestUrbPacketCount; | 
|  | USHORT IsoCRC_Error; | 
|  | USHORT IsoOVERRUN_Error; | 
|  | USHORT IsoINTERNAL_Error; | 
|  | USHORT IsoUNKNOWN_Error; | 
|  | ULONG IsoBytesTransferred; | 
|  | USHORT LateMissedCount; | 
|  | USHORT HWIsoMissedCount; | 
|  | ULONG Reserved7[8]; | 
|  | } HCD_ISO_STAT_COUNTERS, *PHCD_ISO_STAT_COUNTERS; | 
|  |  | 
|  | typedef struct _HCD_STAT_COUNTERS { | 
|  | ULONG BytesTransferred; | 
|  | USHORT IsoMissedCount; | 
|  | USHORT DataOverrunErrorCount; | 
|  | USHORT CrcErrorCount; | 
|  | USHORT ScheduleOverrunCount; | 
|  | USHORT TimeoutErrorCount; | 
|  | USHORT InternalHcErrorCount; | 
|  | USHORT BufferOverrunErrorCount; | 
|  | USHORT SWErrorCount; | 
|  | USHORT StallPidCount; | 
|  | USHORT PortDisableCount; | 
|  | } HCD_STAT_COUNTERS, *PHCD_STAT_COUNTERS; | 
|  |  | 
|  | typedef struct _HCD_STAT_INFORMATION_1 { | 
|  | ULONG Reserved1; | 
|  | ULONG Reserved2; | 
|  | ULONG ResetCounters; | 
|  | LARGE_INTEGER TimeRead; | 
|  | HCD_STAT_COUNTERS Counters; | 
|  | } HCD_STAT_INFORMATION_1, *PHCD_STAT_INFORMATION_1; | 
|  |  | 
|  | typedef struct _HCD_STAT_INFORMATION_2 { | 
|  | ULONG Reserved1; | 
|  | ULONG Reserved2; | 
|  | ULONG ResetCounters; | 
|  | LARGE_INTEGER TimeRead; | 
|  | LONG LockedMemoryUsed; | 
|  | HCD_STAT_COUNTERS Counters; | 
|  | HCD_ISO_STAT_COUNTERS IsoCounters; | 
|  | } HCD_STAT_INFORMATION_2, *PHCD_STAT_INFORMATION_2; | 
|  |  | 
|  | #define WMI_USB_DRIVER_INFORMATION        0 | 
|  | #define WMI_USB_DRIVER_NOTIFICATION       1 | 
|  | #define WMI_USB_POWER_DEVICE_ENABLE       2 | 
|  | #define WMI_USB_HUB_NODE_INFORMATION      4 | 
|  |  | 
|  | #define WMI_USB_PERFORMANCE_INFORMATION   1 | 
|  | #define WMI_USB_DEVICE_NODE_INFORMATION   2 | 
|  |  | 
|  | #if (_WIN32_WINNT >= 0x0501) | 
|  |  | 
|  | typedef enum _USB_NOTIFICATION_TYPE { | 
|  | EnumerationFailure = 0, | 
|  | InsufficentBandwidth, | 
|  | InsufficentPower, | 
|  | OverCurrent, | 
|  | ResetOvercurrent, | 
|  | AcquireBusInfo, | 
|  | AcquireHubName, | 
|  | AcquireControllerName, | 
|  | HubOvercurrent, | 
|  | HubPowerChange, | 
|  | HubNestedTooDeeply, | 
|  | ModernDeviceInLegacyHub | 
|  | } USB_NOTIFICATION_TYPE; | 
|  |  | 
|  | #else /* _WIN32_WINNT >= 0x0501 */ | 
|  |  | 
|  | typedef enum _USB_NOTIFICATION_TYPE { | 
|  | EnumerationFailure = 0, | 
|  | InsufficentBandwidth, | 
|  | InsufficentPower, | 
|  | OverCurrent, | 
|  | ResetOvercurrent, | 
|  | AcquireBusInfo, | 
|  | AcquireHubName, | 
|  | AcquireControllerName, | 
|  | HubOvercurrent, | 
|  | HubPowerChange | 
|  | } USB_NOTIFICATION_TYPE; | 
|  |  | 
|  | #endif /* _WIN32_WINNT >= 0x0501 */ | 
|  |  | 
|  | typedef struct _USB_NOTIFICATION { | 
|  | USB_NOTIFICATION_TYPE NotificationType; | 
|  | } USB_NOTIFICATION, *PUSB_NOTIFICATION; | 
|  |  | 
|  | typedef struct _USB_CONNECTION_NOTIFICATION { | 
|  | USB_NOTIFICATION_TYPE NotificationType; | 
|  | ULONG ConnectionNumber; | 
|  | ULONG RequestedBandwidth; | 
|  | ULONG EnumerationFailReason; | 
|  | ULONG PowerRequested; | 
|  | ULONG HubNameLength; | 
|  | } USB_CONNECTION_NOTIFICATION, *PUSB_CONNECTION_NOTIFICATION; | 
|  |  | 
|  | typedef struct _USB_BUS_NOTIFICATION { | 
|  | USB_NOTIFICATION_TYPE NotificationType; | 
|  | ULONG TotalBandwidth; | 
|  | ULONG ConsumedBandwidth; | 
|  | ULONG ControllerNameLength; | 
|  | } USB_BUS_NOTIFICATION, *PUSB_BUS_NOTIFICATION; | 
|  |  | 
|  | typedef struct _USB_ACQUIRE_INFO { | 
|  | USB_NOTIFICATION_TYPE NotificationType; | 
|  | ULONG TotalSize; | 
|  | WCHAR Buffer[1]; | 
|  | } USB_ACQUIRE_INFO, *PUSB_ACQUIRE_INFO; | 
|  |  | 
|  | #if (_WIN32_WINNT >= 0x0600) | 
|  |  | 
|  | #define USB_NODE_INFO_SIG 'USBN' | 
|  |  | 
|  | typedef enum _USB_WMI_DEVICE_NODE_TYPE { | 
|  | UsbDevice, | 
|  | HubDevice, | 
|  | CompositeDevice, | 
|  | UsbController | 
|  | } USB_WMI_DEVICE_NODE_TYPE, *PUSB_WMI_DEVICE_NODE_TYPE; | 
|  |  | 
|  | typedef struct _USB_DEVICE_STATE { | 
|  | ULONG DeviceConnected:1; | 
|  | ULONG DeviceStarted:1; | 
|  | } USB_DEVICE_STATE, *PUSB_DEVICE_STATE; | 
|  |  | 
|  | typedef struct _USB_HUB_PORT_INFORMATION { | 
|  | USB_DEVICE_STATE DeviceState; | 
|  | USHORT PortNumber; | 
|  | USHORT DeviceAddress; | 
|  | ULONG ConnectionIndex; | 
|  | USB_CONNECTION_STATUS ConnectionStatus; | 
|  | } USB_HUB_PORT_INFORMATION, *PUSB_HUB_PORT_INFORMATION; | 
|  |  | 
|  | typedef struct _USB_HUB_DEVICE_INFO { | 
|  | USB_HUB_DESCRIPTOR HubDescriptor; | 
|  | ULONG HubNumber; | 
|  | USHORT DeviceAddress; | 
|  | BOOLEAN HubIsSelfPowered; | 
|  | BOOLEAN HubIsRootHub; | 
|  | USB_HUB_CAPABILITIES HubCapabilities; | 
|  | ULONG NumberOfHubPorts; | 
|  | USB_HUB_PORT_INFORMATION PortInfo[1]; | 
|  | } USB_HUB_DEVICE_INFO, *PUSB_HUB_DEVICE_INFO; | 
|  |  | 
|  | typedef struct _USB_COMPOSITE_FUNCTION_INFO { | 
|  | UCHAR FunctionNumber; | 
|  | UCHAR BaseInterfaceNumber; | 
|  | UCHAR NumberOfInterfaces; | 
|  | BOOLEAN FunctionIsIdle; | 
|  | } USB_COMPOSITE_FUNCTION_INFO, *PUSB_COMPOSITE_FUNCTION_INFO; | 
|  |  | 
|  | typedef struct _USB_COMPOSITE_DEVICE_INFO { | 
|  | USB_DEVICE_DESCRIPTOR DeviceDescriptor; | 
|  | USB_CONFIGURATION_DESCRIPTOR CurrentConfigDescriptor; | 
|  | UCHAR CurrentConfigurationValue; | 
|  | UCHAR NumberOfFunctions; | 
|  | USB_COMPOSITE_FUNCTION_INFO FunctionInfo[1]; | 
|  | } USB_COMPOSITE_DEVICE_INFO, *PUSB_COMPOSITE_DEVICE_INFO; | 
|  |  | 
|  | typedef struct _USB_CONTROLLER_DEVICE_INFO { | 
|  | ULONG PciVendorId; | 
|  | ULONG PciDeviceId; | 
|  | ULONG PciRevision; | 
|  | ULONG NumberOfRootPorts; | 
|  | ULONG HcFeatureFlags; | 
|  | } USB_CONTROLLER_DEVICE_INFO, *PUSB_CONTROLLER_DEVICE_INFO; | 
|  |  | 
|  | typedef struct _USB_DEVICE_INFO { | 
|  | USB_DEVICE_STATE DeviceState; | 
|  | USHORT PortNumber; | 
|  | USB_DEVICE_DESCRIPTOR DeviceDescriptor; | 
|  | UCHAR CurrentConfigurationValue; | 
|  | USB_DEVICE_SPEED Speed; | 
|  | USHORT DeviceAddress; | 
|  | ULONG ConnectionIndex; | 
|  | USB_CONNECTION_STATUS ConnectionStatus; | 
|  | WCHAR PnpHardwareId[128]; | 
|  | WCHAR PnpCompatibleId[128]; | 
|  | WCHAR SerialNumberId[128]; | 
|  | WCHAR PnpDeviceDescription[128]; | 
|  | ULONG NumberOfOpenPipes; | 
|  | USB_PIPE_INFO PipeList[1]; | 
|  | } USB_DEVICE_INFO, *PUSB_DEVICE_INFO; | 
|  |  | 
|  | typedef struct _USB_DEVICE_NODE_INFO { | 
|  | ULONG Sig; | 
|  | ULONG LengthInBytes; | 
|  | WCHAR DeviceDescription[40]; | 
|  | USB_WMI_DEVICE_NODE_TYPE NodeType; | 
|  | USB_TOPOLOGY_ADDRESS BusAddress; | 
|  | __C89_NAMELESS union { | 
|  | USB_DEVICE_INFO UsbDeviceInfo; | 
|  | USB_HUB_DEVICE_INFO HubDeviceInfo; | 
|  | USB_COMPOSITE_DEVICE_INFO CompositeDeviceInfo; | 
|  | USB_CONTROLLER_DEVICE_INFO ControllerDeviceInfo; | 
|  | UCHAR DeviceInformation[4]; | 
|  | }; | 
|  | } USB_DEVICE_NODE_INFO, *PUSB_DEVICE_NODE_INFO; | 
|  |  | 
|  | typedef struct _USB_DEVICE_PERFORMANCE_INFO { | 
|  | ULONG BulkBytes; | 
|  | ULONG ControlDataBytes; | 
|  | ULONG IsoBytes; | 
|  | ULONG InterruptBytes; | 
|  | ULONG BulkUrbCount; | 
|  | ULONG ControlUrbCount; | 
|  | ULONG IsoUrbCount; | 
|  | ULONG InterruptUrbCount; | 
|  | ULONG AllocedInterrupt[6]; | 
|  | ULONG AllocedIso; | 
|  | ULONG Total32secBandwidth; | 
|  | ULONG TotalTtBandwidth; | 
|  | WCHAR DeviceDescription[60]; | 
|  | USB_DEVICE_SPEED DeviceSpeed; | 
|  | ULONG TotalIsoLatency; | 
|  | ULONG DroppedIsoPackets; | 
|  | ULONG TransferErrors; | 
|  | ULONG PciInterruptCount; | 
|  | ULONG HcIdleState; | 
|  | ULONG HcAsyncIdleState; | 
|  | ULONG HcAsyncCacheFlushCount; | 
|  | ULONG HcPeriodicIdleState; | 
|  | ULONG HcPeriodicCacheFlushCount; | 
|  | } USB_DEVICE_PERFORMANCE_INFO, *PUSB_DEVICE_PERFORMANCE_INFO; | 
|  |  | 
|  | #endif /* _WIN32_WINNT >= 0x0600 */ | 
|  |  | 
|  | #include <poppack.h> | 
|  |  | 
|  | #endif /* USB_KERNEL_IOCTL */ | 
|  |  |