-#include <ntddk.h>
+#pragma once
+
+#include <wdm.h>
#include <hubbusif.h>
#include <usbbusif.h>
-#include <usbioctl.h>
-#include <usb.h>
-#include <debug.h>
-//BROKEN: #include <usbprotocoldefs.h>
+#include <usbdlib.h>
#define USB_HUB_TAG 'hbsu'
#define USB_MAXCHILDREN 127
-/* Lifted from broken header above */
+// Lifted from broken header above
#define C_HUB_LOCAL_POWER 0
#define C_HUB_OVER_CURRENT 1
#define PORT_CONNECTION 0
#define PORT_TEST 21
#define PORT_INDICATOR 22
-typedef struct _USB_ENDPOINT
+typedef struct _PORT_STATUS_CHANGE
{
- ULONG Flags;
- LIST_ENTRY UrbList;
- struct _USB_INTERFACE *Interface;
- USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
-} USB_ENDPOINT, *PUSB_ENDPOINT;
+ USHORT Status;
+ USHORT Change;
+} PORT_STATUS_CHANGE, *PPORT_STATUS_CHANGE;
-typedef struct _USB_INTERFACE
+typedef struct _WORK_ITEM_DATA
{
- struct _USB_CONFIGURATION *Config;
- USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
- USB_ENDPOINT *EndPoints[];
-} USB_INTERFACE, *PUSB_INTERFACE;
+ WORK_QUEUE_ITEM WorkItem;
+ PVOID Context;
+} WORK_ITEM_DATA, *PWORK_ITEM_DATA;
-typedef struct _USB_CONFIGURATION
+typedef struct
{
- struct _USB_DEVICE *Device;
- USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
- USB_INTERFACE *Interfaces[];
-} USB_CONFIGURATION, *PUSB_CONFIGURATION;
+ BOOLEAN IsFDO;
+} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
-typedef struct _USB_DEVICE
+typedef struct _HUB_CHILDDEVICE_EXTENSION
{
- UCHAR Address;
- ULONG Port;
- PVOID ParentDevice;
- BOOLEAN IsHub;
- USB_DEVICE_SPEED DeviceSpeed;
- USB_DEVICE_TYPE DeviceType;
- USB_DEVICE_DESCRIPTOR DeviceDescriptor;
- USB_CONFIGURATION *ActiveConfig;
- USB_INTERFACE *ActiveInterface;
- USB_CONFIGURATION **Configs;
-
-} USB_DEVICE, *PUSB_DEVICE;
+ COMMON_DEVICE_EXTENSION Common;
+ PDEVICE_OBJECT ParentDeviceObject;
+ PUSB_DEVICE_HANDLE UsbDeviceHandle;
+ ULONG PortNumber;
+ UNICODE_STRING usDeviceId;
+ UNICODE_STRING usInstanceId;
+ UNICODE_STRING usHardwareIds;
+ UNICODE_STRING usCompatibleIds;
+ UNICODE_STRING usTextDescription;
+ UNICODE_STRING usLocationInformation;
+ USB_DEVICE_DESCRIPTOR DeviceDesc;
+ PUSB_CONFIGURATION_DESCRIPTOR FullConfigDesc;
+ UNICODE_STRING SymbolicLinkName;
+ USB_BUS_INTERFACE_USBDI_V2 DeviceInterface;
+ USB_DEVICE_INFORMATION_0 DeviceInformation;
+} HUB_CHILDDEVICE_EXTENSION, *PHUB_CHILDDEVICE_EXTENSION;
typedef struct _HUB_DEVICE_EXTENSION
{
- BOOLEAN IsFDO;
- USB_DEVICE* dev;
- PDEVICE_OBJECT LowerDevice;
+ COMMON_DEVICE_EXTENSION Common;
+ PDEVICE_OBJECT LowerDeviceObject;
ULONG ChildCount;
- PDEVICE_OBJECT Children[USB_MAXCHILDREN];
+ PDEVICE_OBJECT ChildDeviceObject[USB_MAXCHILDREN];
+ PDEVICE_OBJECT RootHubPhysicalDeviceObject;
+ PDEVICE_OBJECT RootHubFunctionalDeviceObject;
- PUSB_DEVICE RootHubUsbDevice;
+ ULONG NumberOfHubs;
+ KEVENT ResetComplete;
- PDEVICE_OBJECT RootHubPdo;
- PDEVICE_OBJECT RootHubFdo;
-
- ULONG HubCount;
-
- ULONG PortStatus[256];
+ PORT_STATUS_CHANGE *PortStatusChange;
+ URB PendingSCEUrb;
+ PIRP PendingSCEIrp;
USB_BUS_INTERFACE_HUB_V5 HubInterface;
USB_BUS_INTERFACE_USBDI_V2 UsbDInterface;
USB_HUB_DESCRIPTOR HubDescriptor;
USB_DEVICE_DESCRIPTOR HubDeviceDescriptor;
-
USB_CONFIGURATION_DESCRIPTOR HubConfigDescriptor;
USB_INTERFACE_DESCRIPTOR HubInterfaceDescriptor;
USB_ENDPOINT_DESCRIPTOR HubEndPointDescriptor;
USBD_CONFIGURATION_HANDLE ConfigurationHandle;
USBD_PIPE_HANDLE PipeHandle;
- /* Fields valid only when IsFDO == FALSE */
- UNICODE_STRING DeviceId; // REG_SZ
- UNICODE_STRING InstanceId; // REG_SZ
- UNICODE_STRING HardwareIds; // REG_MULTI_SZ
- UNICODE_STRING CompatibleIds; // REG_MULTI_SZ
+ PVOID RootHubHandle;
+ USB_BUS_INTERFACE_USBDI_V2 DeviceInterface;
+
UNICODE_STRING SymbolicLinkName;
+ ULONG InstanceCount;
+
} HUB_DEVICE_EXTENSION, *PHUB_DEVICE_EXTENSION;
-/* createclose.c */
+// createclose.c
NTSTATUS NTAPI
-UsbhubCreate(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+USBHUB_Create(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
NTSTATUS NTAPI
-UsbhubClose(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+USBHUB_Close(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
NTSTATUS NTAPI
-UsbhubCleanup(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+USBHUB_Cleanup(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
-/* fdo.c */
-NTSTATUS NTAPI
-UsbhubPnpFdo(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+// fdo.c
+NTSTATUS
+USBHUB_FdoHandleDeviceControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
NTSTATUS
-UsbhubDeviceControlFdo(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+USBHUB_FdoHandlePnp(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
-/* misc.c */
+// misc.c
NTSTATUS
ForwardIrpAndWait(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
-NTSTATUS NTAPI
+NTSTATUS
ForwardIrpAndForget(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
NTSTATUS
-UsbhubDuplicateUnicodeString(
- OUT PUNICODE_STRING Destination,
- IN PUNICODE_STRING Source,
- IN POOL_TYPE PoolType);
+SubmitRequestToRootHub(
+ IN PDEVICE_OBJECT RootHubDeviceObject,
+ IN ULONG IoControlCode,
+ OUT PVOID OutParameter1,
+ OUT PVOID OutParameter2);
NTSTATUS
-UsbhubInitMultiSzString(
- OUT PUNICODE_STRING Destination,
- ... /* list of PCSZ */);
+FDO_QueryInterface(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PUSB_BUS_INTERFACE_USBDI_V2 Interface);
-/* pdo.c */
-NTSTATUS NTAPI
-UsbhubPnpPdo(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+// pdo.c
+NTSTATUS
+USBHUB_PdoHandlePnp(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+NTSTATUS
+USBHUB_PdoHandleInternalDeviceControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+VOID
+DumpDeviceDescriptor(
+ PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
+
+VOID
+DumpConfigurationDescriptor(
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
+
+VOID
+DumpFullConfigurationDescriptor(
+ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
+
+NTSTATUS
+GetPortStatusAndChange(
+ IN PDEVICE_OBJECT RootHubDeviceObject,
+ IN ULONG PortId,
+ OUT PPORT_STATUS_CHANGE StatusChange);
+
+// hub_fdo.c
NTSTATUS
-UsbhubInternalDeviceControlPdo(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+USBHUB_ParentFDOStartDevice(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);