Go to the documentation of this file.00001 #pragma once
00002
00003 #define NDEBUG
00004 #include <ntifs.h>
00005 #include <ntddk.h>
00006 #include <wdmguid.h>
00007 #include <hubbusif.h>
00008 #include <usbbusif.h>
00009 #include <usbioctl.h>
00010 #include <usb.h>
00011 #include <stdio.h>
00012 #include <usbdlib.h>
00013 #include <debug.h>
00014
00015 #include <pseh/pseh2.h>
00016
00017 #define USB_HUB_TAG 'hbsu'
00018 #define USB_MAXCHILDREN 127
00019
00020
00021 #define C_HUB_LOCAL_POWER 0
00022 #define C_HUB_OVER_CURRENT 1
00023 #define PORT_CONNECTION 0
00024 #define PORT_ENABLE 1
00025 #define PORT_SUSPEND 2
00026 #define PORT_OVER_CURRENT 3
00027 #define PORT_RESET 4
00028 #define PORT_POWER 8
00029 #define PORT_LOW_SPEED 9
00030 #define C_PORT_CONNECTION 16
00031 #define C_PORT_ENABLE 17
00032 #define C_PORT_SUSPEND 18
00033 #define C_PORT_OVER_CURRENT 19
00034 #define C_PORT_RESET 20
00035 #define PORT_TEST 21
00036 #define PORT_INDICATOR 22
00037
00038 typedef struct _PORT_STATUS_CHANGE
00039 {
00040 USHORT Status;
00041 USHORT Change;
00042 } PORT_STATUS_CHANGE, *PPORT_STATUS_CHANGE;
00043
00044 typedef struct _WORK_ITEM_DATA
00045 {
00046 WORK_QUEUE_ITEM WorkItem;
00047 PVOID Context;
00048 } WORK_ITEM_DATA, *PWORK_ITEM_DATA;
00049
00050 typedef struct
00051 {
00052 BOOLEAN IsFDO;
00053 } COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
00054
00055 typedef struct _HUB_CHILDDEVICE_EXTENSION
00056 {
00057 COMMON_DEVICE_EXTENSION Common;
00058 PDEVICE_OBJECT ParentDeviceObject;
00059 PUSB_DEVICE_HANDLE UsbDeviceHandle;
00060 ULONG PortNumber;
00061 UNICODE_STRING usDeviceId;
00062 UNICODE_STRING usInstanceId;
00063 UNICODE_STRING usHardwareIds;
00064 UNICODE_STRING usCompatibleIds;
00065 UNICODE_STRING usTextDescription;
00066 UNICODE_STRING usLocationInformation;
00067 USB_DEVICE_DESCRIPTOR DeviceDesc;
00068 PUSB_CONFIGURATION_DESCRIPTOR FullConfigDesc;
00069 UNICODE_STRING SymbolicLinkName;
00070 USB_BUS_INTERFACE_USBDI_V2 DeviceInterface;
00071 } HUB_CHILDDEVICE_EXTENSION, *PHUB_CHILDDEVICE_EXTENSION;
00072
00073 typedef struct _HUB_DEVICE_EXTENSION
00074 {
00075 COMMON_DEVICE_EXTENSION Common;
00076 PDEVICE_OBJECT LowerDeviceObject;
00077 ULONG ChildCount;
00078 PDEVICE_OBJECT ChildDeviceObject[USB_MAXCHILDREN];
00079 PDEVICE_OBJECT RootHubPhysicalDeviceObject;
00080 PDEVICE_OBJECT RootHubFunctionalDeviceObject;
00081
00082 ULONG NumberOfHubs;
00083 KEVENT ResetComplete;
00084
00085 PORT_STATUS_CHANGE *PortStatusChange;
00086 URB PendingSCEUrb;
00087 PIRP PendingSCEIrp;
00088
00089 USB_BUS_INTERFACE_HUB_V5 HubInterface;
00090 USB_BUS_INTERFACE_USBDI_V2 UsbDInterface;
00091
00092 USB_HUB_DESCRIPTOR HubDescriptor;
00093 USB_DEVICE_DESCRIPTOR HubDeviceDescriptor;
00094 USB_CONFIGURATION_DESCRIPTOR HubConfigDescriptor;
00095 USB_INTERFACE_DESCRIPTOR HubInterfaceDescriptor;
00096 USB_ENDPOINT_DESCRIPTOR HubEndPointDescriptor;
00097
00098 USB_EXTHUB_INFORMATION_0 UsbExtHubInfo;
00099 USB_DEVICE_INFORMATION_0 DeviceInformation;
00100
00101 USBD_CONFIGURATION_HANDLE ConfigurationHandle;
00102 USBD_PIPE_HANDLE PipeHandle;
00103 PVOID RootHubHandle;
00104 USB_BUS_INTERFACE_USBDI_V2 DeviceInterface;
00105
00106
00107 UNICODE_STRING SymbolicLinkName;
00108 } HUB_DEVICE_EXTENSION, *PHUB_DEVICE_EXTENSION;
00109
00110
00111 NTSTATUS NTAPI
00112 USBHUB_Create(
00113 IN PDEVICE_OBJECT DeviceObject,
00114 IN PIRP Irp);
00115
00116 NTSTATUS NTAPI
00117 USBHUB_Close(
00118 IN PDEVICE_OBJECT DeviceObject,
00119 IN PIRP Irp);
00120
00121 NTSTATUS NTAPI
00122 USBHUB_Cleanup(
00123 IN PDEVICE_OBJECT DeviceObject,
00124 IN PIRP Irp);
00125
00126
00127 NTSTATUS
00128 USBHUB_FdoHandleDeviceControl(
00129 PDEVICE_OBJECT DeviceObject,
00130 PIRP Irp);
00131
00132 NTSTATUS
00133 USBHUB_FdoHandlePnp(
00134 PDEVICE_OBJECT DeviceObject,
00135 PIRP Irp);
00136
00137
00138 NTSTATUS
00139 ForwardIrpAndWait(
00140 IN PDEVICE_OBJECT DeviceObject,
00141 IN PIRP Irp);
00142
00143 NTSTATUS
00144 ForwardIrpAndForget(
00145 IN PDEVICE_OBJECT DeviceObject,
00146 IN PIRP Irp);
00147
00148 NTSTATUS
00149 SubmitRequestToRootHub(
00150 IN PDEVICE_OBJECT RootHubDeviceObject,
00151 IN ULONG IoControlCode,
00152 OUT PVOID OutParameter1,
00153 OUT PVOID OutParameter2);
00154
00155 NTSTATUS
00156 FDO_QueryInterface(
00157 IN PDEVICE_OBJECT DeviceObject,
00158 IN OUT PUSB_BUS_INTERFACE_USBDI_V2 Interface);
00159
00160
00161 NTSTATUS
00162 USBHUB_PdoHandlePnp(
00163 PDEVICE_OBJECT DeviceObject,
00164 PIRP Irp);
00165
00166 NTSTATUS
00167 USBHUB_PdoHandleInternalDeviceControl(
00168 PDEVICE_OBJECT DeviceObject,
00169 PIRP Irp);
00170
00171 VOID
00172 DumpDeviceDescriptor(
00173 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
00174
00175 VOID
00176 DumpConfigurationDescriptor(
00177 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
00178
00179 VOID
00180 DumpFullConfigurationDescriptor(
00181 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
00182
00183 NTSTATUS
00184 GetPortStatusAndChange(
00185 IN PDEVICE_OBJECT RootHubDeviceObject,
00186 IN ULONG PortId,
00187 OUT PPORT_STATUS_CHANGE StatusChange);
00188
00189
00190
00191 NTSTATUS
00192 USBHUB_ParentFDOStartDevice(
00193 IN PDEVICE_OBJECT DeviceObject,
00194 IN PIRP Irp);