2 * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbehci/hub_controller.cpp
5 * PURPOSE: USB EHCI device driver.
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
14 class CHubController
: public IHubController
,
18 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
20 STDMETHODIMP_(ULONG
) AddRef()
22 InterlockedIncrement(&m_Ref
);
25 STDMETHODIMP_(ULONG
) Release()
27 InterlockedDecrement(&m_Ref
);
37 // IHubController interface functions
38 virtual NTSTATUS
Initialize(IN PDRIVER_OBJECT DriverObject
, IN PHCDCONTROLLER Controller
, IN PUSBHARDWAREDEVICE Device
, IN BOOLEAN IsRootHubDevice
, IN ULONG DeviceAddress
);
40 // IDispatchIrp interface functions
41 virtual NTSTATUS
HandlePnp(IN PDEVICE_OBJECT DeviceObject
, IN OUT PIRP Irp
);
42 virtual NTSTATUS
HandlePower(IN PDEVICE_OBJECT DeviceObject
, IN OUT PIRP Irp
);
43 virtual NTSTATUS
HandleDeviceControl(IN PDEVICE_OBJECT DeviceObject
, IN OUT PIRP Irp
);
46 NTSTATUS
HandleQueryInterface(PIO_STACK_LOCATION IoStack
);
47 NTSTATUS
SetDeviceInterface(BOOLEAN bEnable
);
48 NTSTATUS
CreatePDO(PDRIVER_OBJECT DriverObject
, PDEVICE_OBJECT
* OutDeviceObject
);
49 NTSTATUS
GetHubControllerDeviceObject(PDEVICE_OBJECT
* HubDeviceObject
);
51 // constructor / destructor
52 CHubController(IUnknown
*OuterUnknown
){}
53 virtual ~CHubController(){}
57 PHCDCONTROLLER m_Controller
;
58 PUSBHARDWAREDEVICE m_Hardware
;
59 BOOLEAN m_IsRootHubDevice
;
60 ULONG m_DeviceAddress
;
61 ULONG m_PDODeviceNumber
;
62 BOOLEAN m_InterfaceEnabled
;
63 UNICODE_STRING m_HubDeviceInterfaceString
;
64 PDEVICE_OBJECT m_HubControllerDeviceObject
;
65 PDRIVER_OBJECT m_DriverObject
;
68 //----------------------------------------------------------------------------------------
71 CHubController::QueryInterface(
75 return STATUS_UNSUCCESSFUL
;
77 //----------------------------------------------------------------------------------------
79 CHubController::Initialize(
80 IN PDRIVER_OBJECT DriverObject
,
81 IN PHCDCONTROLLER Controller
,
82 IN PUSBHARDWAREDEVICE Device
,
83 IN BOOLEAN IsRootHubDevice
,
84 IN ULONG DeviceAddress
)
87 PCOMMON_DEVICE_EXTENSION DeviceExtension
;
89 DPRINT1("CHubController::Initialize\n");
94 m_Controller
= Controller
;
96 m_IsRootHubDevice
= IsRootHubDevice
;
97 m_DeviceAddress
= DeviceAddress
;
98 m_DriverObject
= DriverObject
;
103 Status
= CreatePDO(m_DriverObject
, &m_HubControllerDeviceObject
);
104 if (!NT_SUCCESS(Status
))
107 // failed to create hub device object
113 // get device extension
115 DeviceExtension
= (PCOMMON_DEVICE_EXTENSION
)m_HubControllerDeviceObject
->DeviceExtension
;
118 // initialize device extension
120 DeviceExtension
->IsFDO
= FALSE
;
121 DeviceExtension
->IsHub
= TRUE
; //FIXME
122 DeviceExtension
->Dispatcher
= PDISPATCHIRP(this);
127 m_HubControllerDeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
130 return STATUS_SUCCESS
;
133 //-----------------------------------------------------------------------------------------
135 CHubController::GetHubControllerDeviceObject(PDEVICE_OBJECT
* HubDeviceObject
)
138 // store controller object
140 *HubDeviceObject
= m_HubControllerDeviceObject
;
142 return STATUS_SUCCESS
;
144 //-----------------------------------------------------------------------------------------
146 CHubController::HandlePnp(
147 IN PDEVICE_OBJECT DeviceObject
,
150 PIO_STACK_LOCATION IoStack
;
151 PCOMMON_DEVICE_EXTENSION DeviceExtension
;
152 PDEVICE_CAPABILITIES DeviceCapabilities
;
153 PPNP_BUS_INFORMATION BusInformation
;
155 ULONG Index
= 0, Length
;
156 USHORT VendorID
, DeviceID
;
157 ULONG HiSpeed
, NumPorts
;
162 // get device extension
164 DeviceExtension
= (PCOMMON_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
169 ASSERT(DeviceExtension
->IsFDO
== FALSE
);
172 // get current stack location
174 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
176 switch(IoStack
->MinorFunction
)
178 case IRP_MN_START_DEVICE
:
180 DPRINT1("CHubController::HandlePnp IRP_MN_START_DEVICE\n");
182 // register device interface
184 Status
= SetDeviceInterface(TRUE
);
187 case IRP_MN_QUERY_ID
:
189 DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack
->Parameters
.QueryId
.IdType
);
191 if (IoStack
->Parameters
.QueryId
.IdType
== BusQueryDeviceID
)
198 Status
= m_Hardware
->GetDeviceDetails(&VendorID
, &DeviceID
, &NumPorts
, &HiSpeed
);
207 swprintf(Buffer
, L
"USB\\ROOT_HUB20");
214 swprintf(Buffer
, L
"USB\\ROOT_HUB");
217 DPRINT1("Name %S\n", Buffer
);
222 Length
= (wcslen(Buffer
) + 1);
227 DeviceName
= (LPWSTR
)ExAllocatePoolWithTag(PagedPool
, Length
* sizeof(WCHAR
), TAG_USBEHCI
);
234 Status
= STATUS_INSUFFICIENT_RESOURCES
;
241 wcscpy(DeviceName
, Buffer
);
246 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceName
;
247 Status
= STATUS_SUCCESS
;
250 Status
= STATUS_UNSUCCESSFUL
;
255 if (IoStack
->Parameters
.QueryId
.IdType
== BusQueryHardwareIDs
)
262 Status
= m_Hardware
->GetDeviceDetails(&VendorID
, &DeviceID
, &NumPorts
, &HiSpeed
);
266 if (!NT_SUCCESS(Status
))
268 DPRINT1("CHubController::HandlePnp> failed to get hardware id %x\n", Status
);
278 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB20&VID%04x&PID%04x&REV0000", VendorID
, DeviceID
) + 1;
279 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB20&VID%04x&PID%04x", VendorID
, DeviceID
) + 1;
280 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB20") + 1;
287 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB&VID%04x&PID%04x&REV0000", VendorID
, DeviceID
) + 1;
288 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB&VID%04x&PID%04x", VendorID
, DeviceID
) + 1;
289 Index
+= swprintf(&Buffer
[Index
], L
"USB\\ROOT_HUB") + 1;
292 Buffer
[Index
] = UNICODE_NULL
;
296 DPRINT1("Name %S\n", Buffer
);
301 DeviceName
= (LPWSTR
)ExAllocatePoolWithTag(PagedPool
, Index
* sizeof(WCHAR
), TAG_USBEHCI
);
308 Status
= STATUS_INSUFFICIENT_RESOURCES
;
315 RtlMoveMemory(DeviceName
, Buffer
, Index
* sizeof(WCHAR
));
320 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceName
;
321 Status
= STATUS_SUCCESS
;
325 Status
= STATUS_SUCCESS
;
328 case IRP_MN_QUERY_CAPABILITIES
:
330 DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_CAPABILITIES\n");
332 DeviceCapabilities
= (PDEVICE_CAPABILITIES
)IoStack
->Parameters
.DeviceCapabilities
.Capabilities
;
334 DeviceCapabilities
->LockSupported
= FALSE
;
335 DeviceCapabilities
->EjectSupported
= FALSE
;
336 DeviceCapabilities
->Removable
= FALSE
;
337 DeviceCapabilities
->DockDevice
= FALSE
;
338 DeviceCapabilities
->UniqueID
= FALSE
;
339 DeviceCapabilities
->SilentInstall
= FALSE
;
340 DeviceCapabilities
->RawDeviceOK
= FALSE
;
341 DeviceCapabilities
->SurpriseRemovalOK
= FALSE
;
342 DeviceCapabilities
->Address
= 0;
343 DeviceCapabilities
->UINumber
= 0;
344 DeviceCapabilities
->DeviceD2
= 1;
347 DeviceCapabilities
->HardwareDisabled
= FALSE
;
348 DeviceCapabilities
->NoDisplayInUI
= FALSE
;
349 DeviceCapabilities
->DeviceState
[0] = PowerDeviceD0
;
350 for (Index
= 0; Index
< PowerSystemMaximum
; Index
++)
351 DeviceCapabilities
->DeviceState
[Index
] = PowerDeviceD3
;
352 DeviceCapabilities
->DeviceWake
= PowerDeviceUnspecified
;
353 DeviceCapabilities
->D1Latency
= 0;
354 DeviceCapabilities
->D2Latency
= 0;
355 DeviceCapabilities
->D3Latency
= 0;
357 Status
= STATUS_SUCCESS
;
360 case IRP_MN_QUERY_INTERFACE
:
362 DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_INTERFACE\n");
365 // handle device interface requests
367 Status
= HandleQueryInterface(IoStack
);
370 case IRP_MN_REMOVE_DEVICE
:
372 DPRINT1("CHubController::HandlePnp IRP_MN_REMOVE_DEVICE\n");
375 // deactivate device interface for BUS PDO
377 SetDeviceInterface(FALSE
);
380 // complete the request first
382 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
383 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
388 IoDeleteDevice(m_HubControllerDeviceObject
);
393 m_HubControllerDeviceObject
= 0;
398 return STATUS_SUCCESS
;
400 case IRP_MN_QUERY_BUS_INFORMATION
:
402 DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_BUS_INFORMATION\n");
405 // allocate buffer for bus information
407 BusInformation
= (PPNP_BUS_INFORMATION
)ExAllocatePool(PagedPool
, sizeof(PNP_BUS_INFORMATION
));
413 RtlMoveMemory(&BusInformation
->BusTypeGuid
, &GUID_BUS_TYPE_USB
, sizeof(GUID
));
418 BusInformation
->LegacyBusType
= PNPBus
;
419 BusInformation
->BusNumber
= 0;
421 Status
= STATUS_SUCCESS
;
422 Irp
->IoStatus
.Information
= (ULONG_PTR
)BusInformation
;
429 Status
= STATUS_INSUFFICIENT_RESOURCES
;
433 case IRP_MN_STOP_DEVICE
:
435 DPRINT1("CHubController::HandlePnp IRP_MN_STOP_DEVICE\n");
439 Status
= STATUS_SUCCESS
;
444 DPRINT1("CHubController::HandlePnp Unhandeled %x\n", IoStack
->MinorFunction
);
445 Status
= Irp
->IoStatus
.Status
;
453 Irp
->IoStatus
.Status
= Status
;
454 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
462 //-----------------------------------------------------------------------------------------
464 CHubController::HandlePower(
465 IN PDEVICE_OBJECT DeviceObject
,
469 Irp
->IoStatus
.Status
= STATUS_NOT_IMPLEMENTED
;
470 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
471 return STATUS_NOT_IMPLEMENTED
;
474 //-----------------------------------------------------------------------------------------
476 CHubController::HandleDeviceControl(
477 IN PDEVICE_OBJECT DeviceObject
,
480 PIO_STACK_LOCATION IoStack
;
481 PCOMMON_DEVICE_EXTENSION DeviceExtension
;
482 NTSTATUS Status
= STATUS_NOT_IMPLEMENTED
;
485 // get current stack location
487 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
490 // get device extension
492 DeviceExtension
= (PCOMMON_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
495 DPRINT1("HandleDeviceControl>Type: FDO %u IoCtl %x InputBufferLength %lu OutputBufferLength %lu\n",
496 DeviceExtension
->IsFDO
,
497 IoStack
->Parameters
.DeviceIoControl
.IoControlCode
,
498 IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
,
499 IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
);
502 // determine which request should be performed
504 switch(IoStack
->Parameters
.DeviceIoControl
.IoControlCode
)
506 case IOCTL_INTERNAL_USB_SUBMIT_URB
:
508 DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB UNIMPLEMENTED\n");
513 Status
= STATUS_NOT_IMPLEMENTED
;
516 case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE
:
518 DPRINT1("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n");
520 if (IoStack
->Parameters
.Others
.Argument1
)
523 // store object as device handle
525 *(PVOID
*)IoStack
->Parameters
.Others
.Argument1
= (PVOID
)this;
526 Status
= STATUS_SUCCESS
;
531 // mis-behaving hub driver
533 Status
= STATUS_INVALID_DEVICE_REQUEST
;
541 case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO
:
543 DPRINT1("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n");
546 // this is the first request send, it delivers the PDO to the caller
548 if (IoStack
->Parameters
.Others
.Argument1
)
551 // store root hub pdo object
553 *(PVOID
*)IoStack
->Parameters
.Others
.Argument1
= DeviceObject
;
556 if (IoStack
->Parameters
.Others
.Argument2
)
559 // documentation claims to deliver the hcd controller object, although it is wrong
561 *(PVOID
*)IoStack
->Parameters
.Others
.Argument2
= DeviceObject
;
567 Status
= STATUS_SUCCESS
;
570 case IOCTL_INTERNAL_USB_GET_HUB_COUNT
:
572 DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n");
575 // after IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO is delivered, the usbhub driver
576 // requests this ioctl to deliver the number of presents.
578 if (IoStack
->Parameters
.Others
.Argument1
)
581 // FIXME / verify: there is only one hub
583 *(PULONG
)IoStack
->Parameters
.Others
.Argument1
= 1;
589 Status
= STATUS_SUCCESS
;
590 Irp
->IoStatus
.Information
= sizeof(ULONG
);
595 Irp
->IoStatus
.Status
= Status
;
596 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
600 //=================================================================================================
602 // Generic Interface functions
606 USBI_InterfaceReference(
609 CHubController
* Controller
= (CHubController
*)BusContext
;
611 DPRINT1("USBH_InterfaceReference\n");
616 Controller
->AddRef();
621 USBI_InterfaceDereference(
624 CHubController
* Controller
= (CHubController
*)BusContext
;
626 DPRINT1("USBH_InterfaceDereference\n");
631 Controller
->Release();
633 //=================================================================================================
635 // USB Hub Interface functions
639 USBHI_CreateUsbDevice(
641 PUSB_DEVICE_HANDLE
*NewDevice
,
642 PUSB_DEVICE_HANDLE HubDeviceHandle
,
647 return STATUS_NOT_IMPLEMENTED
;
652 USBHI_InitializeUsbDevice(
654 PUSB_DEVICE_HANDLE DeviceHandle
)
657 return STATUS_NOT_IMPLEMENTED
;
662 USBHI_GetUsbDescriptors(
664 PUSB_DEVICE_HANDLE DeviceHandle
,
665 PUCHAR DeviceDescriptorBuffer
,
666 PULONG DeviceDescriptorBufferLength
,
667 PUCHAR ConfigDescriptorBuffer
,
668 PULONG ConfigDescriptorBufferLength
)
671 return STATUS_NOT_IMPLEMENTED
;
676 USBHI_RemoveUsbDevice(
678 PUSB_DEVICE_HANDLE DeviceHandle
,
682 return STATUS_NOT_IMPLEMENTED
;
687 USBHI_RestoreUsbDevice(
689 PUSB_DEVICE_HANDLE OldDeviceHandle
,
690 PUSB_DEVICE_HANDLE NewDeviceHandle
)
693 return STATUS_NOT_IMPLEMENTED
;
698 USBHI_GetPortHackFlags(
703 return STATUS_NOT_IMPLEMENTED
;
708 USBHI_QueryDeviceInformation(
710 PUSB_DEVICE_HANDLE DeviceHandle
,
711 PVOID DeviceInformationBuffer
,
712 ULONG DeviceInformationBufferLength
,
713 PULONG LengthReturned
)
716 return STATUS_NOT_IMPLEMENTED
;
721 USBHI_GetControllerInformation(
723 PVOID ControllerInformationBuffer
,
724 ULONG ControllerInformationBufferLength
,
725 PULONG LengthReturned
)
728 return STATUS_NOT_IMPLEMENTED
;
733 USBHI_ControllerSelectiveSuspend(
738 return STATUS_NOT_IMPLEMENTED
;
743 USBHI_GetExtendedHubInformation(
745 PDEVICE_OBJECT HubPhysicalDeviceObject
,
746 PVOID HubInformationBuffer
,
747 ULONG HubInformationBufferLength
,
748 PULONG LengthReturned
)
751 return STATUS_NOT_IMPLEMENTED
;
756 USBHI_GetRootHubSymbolicName(
758 PVOID HubSymNameBuffer
,
759 ULONG HubSymNameBufferLength
,
760 PULONG HubSymNameActualLength
)
763 return STATUS_NOT_IMPLEMENTED
;
768 USBHI_GetDeviceBusContext(
778 USBHI_Initialize20Hub(
780 PUSB_DEVICE_HANDLE HubDeviceHandle
,
784 return STATUS_NOT_IMPLEMENTED
;
789 USBHI_RootHubInitNotification(
791 PVOID CallbackContext
,
792 PRH_INIT_CALLBACK CallbackRoutine
)
795 return STATUS_NOT_IMPLEMENTED
;
800 USBHI_FlushTransfers(
809 USBHI_SetDeviceHandleData(
812 PDEVICE_OBJECT UsbDevicePdo
)
817 //=================================================================================================
819 // USB Device Interface functions
824 USBDI_GetUSBDIVersion(
826 PUSBD_VERSION_INFORMATION VersionInformation
,
827 PULONG HcdCapabilites
)
839 return STATUS_NOT_IMPLEMENTED
;
844 USBDI_SubmitIsoOutUrb(
849 return STATUS_NOT_IMPLEMENTED
;
854 USBDI_QueryBusInformation(
857 PVOID BusInformationBuffer
,
858 PULONG BusInformationBufferLength
,
859 PULONG BusInformationActualLength
)
862 return STATUS_NOT_IMPLEMENTED
;
867 USBDI_IsDeviceHighSpeed(
884 return STATUS_NOT_IMPLEMENTED
;
888 CHubController::HandleQueryInterface(
889 PIO_STACK_LOCATION IoStack
)
891 PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub
;
892 PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI
;
893 UNICODE_STRING GuidBuffer
;
896 if (IsEqualGUIDAligned(*IoStack
->Parameters
.QueryInterface
.InterfaceType
, USB_BUS_INTERFACE_HUB_GUID
))
899 // get request parameters
901 InterfaceHub
= (PUSB_BUS_INTERFACE_HUB_V5
)IoStack
->Parameters
.QueryInterface
.Interface
;
902 InterfaceHub
->Version
= IoStack
->Parameters
.QueryInterface
.Version
;
907 if (IoStack
->Parameters
.QueryInterface
.Version
>= 6)
909 DPRINT1("USB_BUS_INTERFACE_HUB_GUID version %x not supported!\n", IoStack
->Parameters
.QueryInterface
.Version
);
912 // version not supported
914 return STATUS_NOT_SUPPORTED
;
918 // Interface version 0
920 if (IoStack
->Parameters
.QueryInterface
.Version
>= 0)
922 InterfaceHub
->Size
= IoStack
->Parameters
.QueryInterface
.Size
;
923 InterfaceHub
->BusContext
= PVOID(this);
924 InterfaceHub
->InterfaceReference
= USBI_InterfaceReference
;
925 InterfaceHub
->InterfaceDereference
= USBI_InterfaceDereference
;
929 // Interface version 1
931 if (IoStack
->Parameters
.QueryInterface
.Version
>= 1)
933 InterfaceHub
->CreateUsbDevice
= USBHI_CreateUsbDevice
;
934 InterfaceHub
->InitializeUsbDevice
= USBHI_InitializeUsbDevice
;
935 InterfaceHub
->GetUsbDescriptors
= USBHI_GetUsbDescriptors
;
936 InterfaceHub
->RemoveUsbDevice
= USBHI_RemoveUsbDevice
;
937 InterfaceHub
->RestoreUsbDevice
= USBHI_RestoreUsbDevice
;
938 InterfaceHub
->GetPortHackFlags
= USBHI_GetPortHackFlags
;
939 InterfaceHub
->QueryDeviceInformation
= USBHI_QueryDeviceInformation
;
943 // Interface version 2
945 if (IoStack
->Parameters
.QueryInterface
.Version
>= 2)
947 InterfaceHub
->GetControllerInformation
= USBHI_GetControllerInformation
;
948 InterfaceHub
->ControllerSelectiveSuspend
= USBHI_ControllerSelectiveSuspend
;
949 InterfaceHub
->GetExtendedHubInformation
= USBHI_GetExtendedHubInformation
;
950 InterfaceHub
->GetRootHubSymbolicName
= USBHI_GetRootHubSymbolicName
;
951 InterfaceHub
->GetDeviceBusContext
= USBHI_GetDeviceBusContext
;
952 InterfaceHub
->Initialize20Hub
= USBHI_Initialize20Hub
;
957 // Interface version 3
959 if (IoStack
->Parameters
.QueryInterface
.Version
>= 3)
961 InterfaceHub
->RootHubInitNotification
= USBHI_RootHubInitNotification
;
965 // Interface version 4
967 if (IoStack
->Parameters
.QueryInterface
.Version
>= 4)
969 InterfaceHub
->FlushTransfers
= USBHI_FlushTransfers
;
973 // Interface version 5
975 if (IoStack
->Parameters
.QueryInterface
.Version
>= 5)
977 InterfaceHub
->SetDeviceHandleData
= USBHI_SetDeviceHandleData
;
983 return STATUS_SUCCESS
;
985 else if (IsEqualGUIDAligned(*IoStack
->Parameters
.QueryInterface
.InterfaceType
, USB_BUS_INTERFACE_USBDI_GUID
))
988 // get request parameters
990 InterfaceDI
= (PUSB_BUS_INTERFACE_USBDI_V2
) IoStack
->Parameters
.QueryInterface
.Interface
;
991 InterfaceDI
->Version
= IoStack
->Parameters
.QueryInterface
.Version
;
996 if (IoStack
->Parameters
.QueryInterface
.Version
>= 3)
998 DPRINT1("USB_BUS_INTERFACE_USBDI_GUID version %x not supported!\n", IoStack
->Parameters
.QueryInterface
.Version
);
1001 // version not supported
1003 return STATUS_NOT_SUPPORTED
;
1007 // interface version 0
1009 if (IoStack
->Parameters
.QueryInterface
.Version
>= 0)
1011 InterfaceDI
->Size
= IoStack
->Parameters
.QueryInterface
.Size
;
1012 InterfaceDI
->BusContext
= PVOID(this);
1013 InterfaceDI
->InterfaceReference
= USBI_InterfaceReference
;
1014 InterfaceDI
->InterfaceDereference
= USBI_InterfaceDereference
;
1015 InterfaceDI
->GetUSBDIVersion
= USBDI_GetUSBDIVersion
;
1016 InterfaceDI
->QueryBusTime
= USBDI_QueryBusTime
;
1017 InterfaceDI
->SubmitIsoOutUrb
= USBDI_SubmitIsoOutUrb
;
1018 InterfaceDI
->QueryBusInformation
= USBDI_QueryBusInformation
;
1022 // interface version 1
1024 if (IoStack
->Parameters
.QueryInterface
.Version
>= 1)
1026 InterfaceDI
->IsDeviceHighSpeed
= USBDI_IsDeviceHighSpeed
;
1030 // interface version 2
1032 if (IoStack
->Parameters
.QueryInterface
.Version
>= 2)
1034 InterfaceDI
->EnumLogEntry
= USBDI_EnumLogEntry
;
1038 // request completed
1040 return STATUS_SUCCESS
;
1045 // convert guid to string
1047 Status
= RtlStringFromGUID(*IoStack
->Parameters
.QueryInterface
.InterfaceType
, &GuidBuffer
);
1048 if (NT_SUCCESS(Status
))
1053 DPRINT1("HandleQueryInterface UNKNOWN INTERFACE GUID: %wZ Version %x\n", &GuidBuffer
, IoStack
->Parameters
.QueryInterface
.Version
);
1058 RtlFreeUnicodeString(&GuidBuffer
);
1061 return STATUS_NOT_SUPPORTED
;
1065 CHubController::SetDeviceInterface(
1068 NTSTATUS Status
= STATUS_SUCCESS
;
1073 // register device interface
1075 Status
= IoRegisterDeviceInterface(m_HubControllerDeviceObject
, &GUID_DEVINTERFACE_USB_HUB
, 0, &m_HubDeviceInterfaceString
);
1077 if (NT_SUCCESS(Status
))
1080 // now enable the device interface
1082 Status
= IoSetDeviceInterfaceState(&m_HubDeviceInterfaceString
, TRUE
);
1087 m_InterfaceEnabled
= TRUE
;
1090 else if (m_InterfaceEnabled
)
1093 // disable device interface
1095 Status
= IoSetDeviceInterfaceState(&m_HubDeviceInterfaceString
, FALSE
);
1097 if (NT_SUCCESS(Status
))
1100 // now delete interface string
1102 RtlFreeUnicodeString(&m_HubDeviceInterfaceString
);
1106 // disable interface
1108 m_InterfaceEnabled
= FALSE
;
1118 CHubController::CreatePDO(
1119 PDRIVER_OBJECT DriverObject
,
1120 PDEVICE_OBJECT
* OutDeviceObject
)
1122 WCHAR CharDeviceName
[64];
1124 ULONG UsbDeviceNumber
= 0;
1125 UNICODE_STRING DeviceName
;
1130 // construct device name
1132 swprintf(CharDeviceName
, L
"\\Device\\USBPDO-%d", UsbDeviceNumber
);
1135 // initialize device name
1137 RtlInitUnicodeString(&DeviceName
, CharDeviceName
);
1142 Status
= IoCreateDevice(DriverObject
,
1143 sizeof(COMMON_DEVICE_EXTENSION
),
1145 FILE_DEVICE_CONTROLLER
,
1150 /* check for success */
1151 if (NT_SUCCESS(Status
))
1155 // is there a device object with that same name
1157 if ((Status
== STATUS_OBJECT_NAME_EXISTS
) || (Status
== STATUS_OBJECT_NAME_COLLISION
))
1160 // Try the next name
1167 // bail out on other errors
1169 if (!NT_SUCCESS(Status
))
1171 DPRINT1("CreatePDO: Failed to create %wZ, Status %x\n", &DeviceName
, Status
);
1179 //m_PDODeviceNumber = UsbDeviceNumber;
1181 DPRINT1("CreateFDO: DeviceName %wZ\n", &DeviceName
);
1190 CreateHubController(
1191 PHUBCONTROLLER
*OutHcdController
)
1193 PHUBCONTROLLER This
;
1196 // allocate controller
1198 This
= new(NonPagedPool
, TAG_USBEHCI
) CHubController(0);
1202 // failed to allocate
1204 return STATUS_INSUFFICIENT_RESOURCES
;
1208 // add reference count
1215 *OutHcdController
= (PHUBCONTROLLER
)This
;
1220 return STATUS_SUCCESS
;