2 * PROJECT: ReactOS USB Port Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: USBPort interface functions
5 * COPYRIGHT: Copyright 2017 Vadim Galyant <vgal@rambler.ru>
15 USBI_InterfaceReference(IN PVOID BusContext
)
17 DPRINT("USBI_InterfaceReference \n");
22 USBI_InterfaceDereference(IN PVOID BusContext
)
24 DPRINT("USBI_InterfaceDereference \n");
27 /* USB port driver Interface functions */
31 USBHI_CreateUsbDevice(IN PVOID BusContext
,
32 IN OUT PUSB_DEVICE_HANDLE
*UsbdDeviceHandle
,
33 IN PUSB_DEVICE_HANDLE UsbdHubDeviceHandle
,
37 PDEVICE_OBJECT PdoDevice
;
38 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
39 PUSB_DEVICE_HANDLE deviceHandle
= NULL
;
42 DPRINT("USBHI_CreateUsbDevice: ... \n");
44 PdoDevice
= BusContext
;
45 PdoExtension
= PdoDevice
->DeviceExtension
;
47 Status
= USBPORT_CreateDevice(&deviceHandle
,
48 PdoExtension
->FdoDevice
,
49 (PUSBPORT_DEVICE_HANDLE
)UsbdHubDeviceHandle
,
53 *UsbdDeviceHandle
= deviceHandle
;
60 USBHI_InitializeUsbDevice(IN PVOID BusContext
,
61 OUT PUSB_DEVICE_HANDLE UsbdDeviceHandle
)
63 PDEVICE_OBJECT PdoDevice
;
64 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
66 DPRINT("USBHI_InitializeUsbDevice \n");
68 PdoDevice
= BusContext
;
69 PdoExtension
= PdoDevice
->DeviceExtension
;
71 return USBPORT_InitializeDevice((PUSBPORT_DEVICE_HANDLE
)UsbdDeviceHandle
,
72 PdoExtension
->FdoDevice
);
77 USBHI_GetUsbDescriptors(IN PVOID BusContext
,
78 IN PUSB_DEVICE_HANDLE UsbdDeviceHandle
,
79 IN PUCHAR DeviceDescBuffer
,
80 IN PULONG DeviceDescBufferLen
,
81 IN PUCHAR ConfigDescBuffer
,
82 IN PULONG ConfigDescBufferLen
)
84 PDEVICE_OBJECT PdoDevice
;
85 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
86 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
90 DPRINT("USBHI_GetUsbDescriptors ...\n");
92 PdoDevice
= BusContext
;
93 PdoExtension
= PdoDevice
->DeviceExtension
;
94 DeviceHandle
= (PUSBPORT_DEVICE_HANDLE
)UsbdDeviceHandle
;
96 if (DeviceDescBuffer
&& *DeviceDescBufferLen
)
98 if (*DeviceDescBufferLen
> sizeof(USB_DEVICE_DESCRIPTOR
))
99 *DeviceDescBufferLen
= sizeof(USB_DEVICE_DESCRIPTOR
);
101 RtlCopyMemory(DeviceDescBuffer
,
102 &DeviceHandle
->DeviceDescriptor
,
103 *DeviceDescBufferLen
);
106 Status
= USBPORT_GetUsbDescriptor(DeviceHandle
,
107 PdoExtension
->FdoDevice
,
108 USB_CONFIGURATION_DESCRIPTOR_TYPE
,
110 ConfigDescBufferLen
);
112 USBPORT_DumpingDeviceDescriptor((PUSB_DEVICE_DESCRIPTOR
)DeviceDescBuffer
);
119 USBHI_RemoveUsbDevice(IN PVOID BusContext
,
120 IN OUT PUSB_DEVICE_HANDLE UsbdDeviceHandle
,
123 PDEVICE_OBJECT PdoDevice
;
124 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
126 DPRINT("USBHI_RemoveUsbDevice: UsbdDeviceHandle - %p, Flags - %x\n",
130 PdoDevice
= BusContext
;
131 PdoExtension
= PdoDevice
->DeviceExtension
;
133 return USBPORT_RemoveDevice(PdoExtension
->FdoDevice
,
134 (PUSBPORT_DEVICE_HANDLE
)UsbdDeviceHandle
,
140 USBHI_RestoreUsbDevice(IN PVOID BusContext
,
141 OUT PUSB_DEVICE_HANDLE OldUsbdDeviceHandle
,
142 OUT PUSB_DEVICE_HANDLE NewUsbdDeviceHandle
)
144 PDEVICE_OBJECT PdoDevice
;
145 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
147 DPRINT("USBHI_RestoreUsbDevice: OldUsbdDeviceHandle - %p, NewUsbdDeviceHandle - %x\n",
149 NewUsbdDeviceHandle
);
151 PdoDevice
= BusContext
;
152 PdoExtension
= PdoDevice
->DeviceExtension
;
154 return USBPORT_RestoreDevice(PdoExtension
->FdoDevice
,
155 (PUSBPORT_DEVICE_HANDLE
)OldUsbdDeviceHandle
,
156 (PUSBPORT_DEVICE_HANDLE
)NewUsbdDeviceHandle
);
161 USBHI_QueryDeviceInformation(IN PVOID BusContext
,
162 IN PUSB_DEVICE_HANDLE UsbdDeviceHandle
,
163 OUT PVOID DeviceInfoBuffer
,
164 IN ULONG DeviceInfoBufferLen
,
165 OUT PULONG LenDataReturned
)
167 PUSB_DEVICE_INFORMATION_0 DeviceInfo
;
168 PUSBPORT_CONFIGURATION_HANDLE ConfigHandle
;
169 PLIST_ENTRY InterfaceEntry
;
170 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
171 ULONG NumberOfOpenPipes
= 0;
172 PUSB_PIPE_INFORMATION_0 PipeInfo
;
173 PUSBPORT_PIPE_HANDLE PipeHandle
;
174 PUSBPORT_INTERFACE_HANDLE InterfaceHandle
;
178 DPRINT("USBHI_QueryDeviceInformation: ... \n");
180 *LenDataReturned
= 0;
182 if (DeviceInfoBufferLen
< sizeof(USB_LEVEL_INFORMATION
))
184 return STATUS_BUFFER_TOO_SMALL
;
187 DeviceInfo
= DeviceInfoBuffer
;
189 if (DeviceInfo
->InformationLevel
> 0)
191 return STATUS_NOT_SUPPORTED
;
194 DeviceHandle
= UsbdDeviceHandle
;
195 ConfigHandle
= DeviceHandle
->ConfigHandle
;
199 InterfaceEntry
= ConfigHandle
->InterfaceHandleList
.Flink
;
201 while (InterfaceEntry
&&
202 InterfaceEntry
!= &ConfigHandle
->InterfaceHandleList
)
204 InterfaceHandle
= CONTAINING_RECORD(InterfaceEntry
,
205 USBPORT_INTERFACE_HANDLE
,
208 NumberOfOpenPipes
+= InterfaceHandle
->InterfaceDescriptor
.bNumEndpoints
;
210 InterfaceEntry
= InterfaceEntry
->Flink
;
214 ActualLength
= sizeof(USB_DEVICE_INFORMATION_0
) +
215 (NumberOfOpenPipes
- 1) * sizeof(USB_PIPE_INFORMATION_0
);
217 if (DeviceInfoBufferLen
< ActualLength
)
219 DeviceInfo
->ActualLength
= ActualLength
;
220 *LenDataReturned
= sizeof(USB_LEVEL_INFORMATION
);
222 return STATUS_BUFFER_TOO_SMALL
;
225 RtlZeroMemory(DeviceInfo
, ActualLength
);
227 DeviceInfo
->InformationLevel
= 0;
228 DeviceInfo
->ActualLength
= ActualLength
;
229 DeviceInfo
->DeviceAddress
= DeviceHandle
->DeviceAddress
;
230 DeviceInfo
->NumberOfOpenPipes
= NumberOfOpenPipes
;
231 DeviceInfo
->DeviceSpeed
= DeviceHandle
->DeviceSpeed
;
233 RtlCopyMemory(&DeviceInfo
->DeviceDescriptor
,
234 &DeviceHandle
->DeviceDescriptor
,
235 sizeof(USB_DEVICE_DESCRIPTOR
));
237 USBPORT_DumpingDeviceDescriptor(&DeviceInfo
->DeviceDescriptor
);
239 if (DeviceHandle
->DeviceSpeed
== UsbFullSpeed
||
240 DeviceHandle
->DeviceSpeed
== UsbLowSpeed
)
242 DeviceInfo
->DeviceType
= Usb11Device
;
244 else if (DeviceHandle
->DeviceSpeed
== UsbHighSpeed
)
246 DeviceInfo
->DeviceType
= Usb20Device
;
249 DeviceInfo
->CurrentConfigurationValue
= 0;
253 *LenDataReturned
= ActualLength
;
254 return STATUS_SUCCESS
;
257 DeviceInfo
->CurrentConfigurationValue
=
258 ConfigHandle
->ConfigurationDescriptor
->bConfigurationValue
;
260 InterfaceEntry
= ConfigHandle
->InterfaceHandleList
.Flink
;
262 while (InterfaceEntry
&&
263 InterfaceEntry
!= &ConfigHandle
->InterfaceHandleList
)
265 InterfaceHandle
= CONTAINING_RECORD(InterfaceEntry
,
266 USBPORT_INTERFACE_HANDLE
,
269 if (InterfaceHandle
->InterfaceDescriptor
.bNumEndpoints
> 0)
271 PipeInfo
= &DeviceInfo
->PipeList
[0];
272 PipeHandle
= &InterfaceHandle
->PipeHandle
[0];
275 ix
< InterfaceHandle
->InterfaceDescriptor
.bNumEndpoints
;
278 if (PipeHandle
->Flags
& PIPE_HANDLE_FLAG_NULL_PACKET_SIZE
)
280 PipeInfo
->ScheduleOffset
= 1;
284 PipeInfo
->ScheduleOffset
=
285 PipeHandle
->Endpoint
->EndpointProperties
.ScheduleOffset
;
288 RtlCopyMemory(&PipeInfo
->EndpointDescriptor
,
289 &PipeHandle
->EndpointDescriptor
,
290 sizeof(USB_ENDPOINT_DESCRIPTOR
));
297 InterfaceEntry
= InterfaceEntry
->Flink
;
300 *LenDataReturned
= ActualLength
;
302 return STATUS_SUCCESS
;
307 USBHI_GetControllerInformation(IN PVOID BusContext
,
308 OUT PVOID ControllerInfoBuffer
,
309 IN ULONG ControllerInfoBufferLen
,
310 OUT PULONG LenDataReturned
)
312 PDEVICE_OBJECT PdoDevice
;
313 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
314 PDEVICE_OBJECT FdoDevice
;
315 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
316 PUSB_CONTROLLER_INFORMATION_0 InfoBuffer
;
319 DPRINT("USBHI_GetControllerInformation: ControllerInfoBufferLen - %x\n",
320 ControllerInfoBufferLen
);
322 PdoDevice
= BusContext
;
323 PdoExtension
= PdoDevice
->DeviceExtension
;
324 FdoDevice
= PdoExtension
->FdoDevice
;
325 FdoExtension
= FdoDevice
->DeviceExtension
;
327 InfoBuffer
= ControllerInfoBuffer
;
329 *LenDataReturned
= 0;
331 if (ControllerInfoBufferLen
< sizeof(USB_LEVEL_INFORMATION
))
333 Status
= STATUS_BUFFER_TOO_SMALL
;
337 *LenDataReturned
= sizeof(USB_LEVEL_INFORMATION
);
339 if (InfoBuffer
->InformationLevel
> 0)
341 Status
= STATUS_NOT_SUPPORTED
;
345 InfoBuffer
->ActualLength
= sizeof(USB_CONTROLLER_INFORMATION_0
);
347 if (ControllerInfoBufferLen
>= sizeof(USB_CONTROLLER_INFORMATION_0
))
349 InfoBuffer
->SelectiveSuspendEnabled
=
350 (FdoExtension
->Flags
& USBPORT_FLAG_SELECTIVE_SUSPEND
) ==
351 USBPORT_FLAG_SELECTIVE_SUSPEND
;
354 *LenDataReturned
= sizeof(USB_CONTROLLER_INFORMATION_0
);
356 return STATUS_SUCCESS
;
361 USBHI_ControllerSelectiveSuspend(IN PVOID BusContext
,
364 PDEVICE_OBJECT PdoDevice
;
365 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
366 PDEVICE_OBJECT FdoDevice
;
367 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
372 DPRINT("USBHI_ControllerSelectiveSuspend: Enable - %x\n", Enable
);
374 PdoDevice
= BusContext
;
375 PdoExtension
= PdoDevice
->DeviceExtension
;
376 FdoDevice
= PdoExtension
->FdoDevice
;
377 FdoExtension
= FdoDevice
->DeviceExtension
;
379 Flags
= FdoExtension
->Flags
;
381 if (Flags
& USBPORT_FLAG_BIOS_DISABLE_SS
)
383 return STATUS_SUCCESS
;
388 FdoExtension
->Flags
|= USBPORT_FLAG_SELECTIVE_SUSPEND
;
393 FdoExtension
->Flags
&= ~USBPORT_FLAG_SELECTIVE_SUSPEND
;
397 Status
= USBPORT_SetRegistryKeyValue(FdoExtension
->CommonExtension
.LowerPdoDevice
,
400 L
"HcDisableSelectiveSuspend",
404 if (NT_SUCCESS(Status
))
407 FdoExtension
->Flags
|= USBPORT_FLAG_SELECTIVE_SUSPEND
;
409 FdoExtension
->Flags
&= ~USBPORT_FLAG_SELECTIVE_SUSPEND
;
417 USBHI_GetExtendedHubInformation(IN PVOID BusContext
,
418 IN PDEVICE_OBJECT HubPhysicalDeviceObject
,
419 IN OUT PVOID HubInformationBuffer
,
421 IN OUT PULONG LenDataReturned
)
423 PDEVICE_OBJECT PdoDevice
;
424 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
425 PDEVICE_OBJECT FdoDevice
;
426 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
427 PUSBPORT_REGISTRATION_PACKET Packet
;
430 PUSB_EXTHUB_INFORMATION_0 HubInfoBuffer
;
431 USB_PORT_STATUS_AND_CHANGE PortStatus
;
434 DPRINT("USBHI_GetExtendedHubInformation: ... \n");
436 PdoDevice
= BusContext
;
437 PdoExtension
= PdoDevice
->DeviceExtension
;
438 FdoDevice
= PdoExtension
->FdoDevice
;
439 FdoExtension
= FdoDevice
->DeviceExtension
;
440 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
442 HubInfoBuffer
= HubInformationBuffer
;
443 PortStatus
.AsUlong32
= 0;
445 if (HubPhysicalDeviceObject
!= PdoDevice
)
447 *LenDataReturned
= 0;
448 return STATUS_NOT_SUPPORTED
;
451 if (HubInfoLen
< sizeof(USB_EXTHUB_INFORMATION_0
))
453 *LenDataReturned
= 0;
454 return STATUS_BUFFER_TOO_SMALL
;
457 NumPorts
= PdoExtension
->RootHubDescriptors
->Descriptor
.bNumberOfPorts
;
458 HubInfoBuffer
->NumberOfPorts
= NumPorts
;
462 *LenDataReturned
= sizeof(USB_EXTHUB_INFORMATION_0
);
463 return STATUS_SUCCESS
;
466 for (ix
= 0; ix
< HubInfoBuffer
->NumberOfPorts
; ++ix
)
468 HubInfoBuffer
->Port
[ix
].PhysicalPortNumber
= ix
+ 1;
469 HubInfoBuffer
->Port
[ix
].PortLabelNumber
= ix
;
470 HubInfoBuffer
->Port
[ix
].VidOverride
= 0;
471 HubInfoBuffer
->Port
[ix
].PidOverride
= 0;
472 HubInfoBuffer
->Port
[ix
].PortAttributes
= 0;
474 if (Packet
->MiniPortFlags
& USB_MINIPORT_FLAGS_USB2
)
476 HubInfoBuffer
->Port
[ix
].PortAttributes
= USB_PORTATTR_SHARED_USB2
;
478 Packet
->RH_GetPortStatus(FdoExtension
->MiniPortExt
,
482 if (PortStatus
.PortStatus
.Usb20PortStatus
.AsUshort16
& 0x8000)
484 HubInfoBuffer
->Port
[ix
].PortAttributes
|= USB_PORTATTR_OWNED_BY_CC
;
489 if (!(FdoExtension
->Flags
& USBPORT_FLAG_COMPANION_HC
))
494 if (USBPORT_FindUSB2Controller(FdoDevice
))
496 HubInfoBuffer
->Port
[ix
].PortAttributes
|= USB_PORTATTR_NO_OVERCURRENT_UI
;
501 for (ix
= 0; ix
< HubInfoBuffer
->NumberOfPorts
; ++ix
)
505 USBPORT_GetRegistryKeyValueFullInfo(FdoDevice
,
506 FdoExtension
->CommonExtension
.LowerPdoDevice
,
509 sizeof(L
"PortAttrX"),
513 HubInfoBuffer
->Port
[ix
].PortAttributes
|= PortAttrX
;
516 *LenDataReturned
= sizeof(USB_EXTHUB_INFORMATION_0
);
518 return STATUS_SUCCESS
;
523 USBHI_GetRootHubSymbolicName(IN PVOID BusContext
,
524 IN OUT PVOID HubInfoBuffer
,
525 IN ULONG HubInfoBufferLen
,
526 OUT PULONG HubNameActualLen
)
528 PDEVICE_OBJECT PdoDevice
;
529 UNICODE_STRING HubName
;
530 PUNICODE_STRING InfoBuffer
;
533 DPRINT("USBHI_GetRootHubSymbolicName: ... \n");
535 PdoDevice
= BusContext
;
537 Status
= USBPORT_GetSymbolicName(PdoDevice
, &HubName
);
539 if (HubInfoBufferLen
< HubName
.Length
)
541 InfoBuffer
= HubInfoBuffer
;
542 InfoBuffer
->Length
= 0;
546 RtlCopyMemory(HubInfoBuffer
, HubName
.Buffer
, HubName
.Length
);
549 *HubNameActualLen
= HubName
.Length
;
551 if (NT_SUCCESS(Status
))
552 RtlFreeUnicodeString(&HubName
);
559 USBHI_GetDeviceBusContext(IN PVOID BusContext
,
560 IN PVOID DeviceHandle
)
562 DPRINT1("USBHI_GetDeviceBusContext: UNIMPLEMENTED. FIXME. \n");
568 USBHI_Initialize20Hub(IN PVOID BusContext
,
569 IN PUSB_DEVICE_HANDLE UsbdHubDeviceHandle
,
572 PDEVICE_OBJECT PdoDevice
;
573 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
575 DPRINT("USBHI_Initialize20Hub: UsbdHubDeviceHandle - %p, TtCount - %x\n",
579 PdoDevice
= BusContext
;
580 PdoExtension
= PdoDevice
->DeviceExtension
;
582 return USBPORT_Initialize20Hub(PdoExtension
->FdoDevice
,
583 (PUSBPORT_DEVICE_HANDLE
)UsbdHubDeviceHandle
,
589 USBHI_RootHubInitNotification(IN PVOID BusContext
,
590 IN PVOID CallbackContext
,
591 IN PRH_INIT_CALLBACK CallbackFunction
)
593 PDEVICE_OBJECT PdoDevice
;
594 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
595 PDEVICE_OBJECT FdoDevice
;
596 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
599 DPRINT("USBHI_RootHubInitNotification \n");
601 PdoDevice
= BusContext
;
602 PdoExtension
= PdoDevice
->DeviceExtension
;
603 FdoDevice
= PdoExtension
->FdoDevice
;
604 FdoExtension
= FdoDevice
->DeviceExtension
;
606 KeAcquireSpinLock(&FdoExtension
->RootHubCallbackSpinLock
, &OldIrql
);
607 PdoExtension
->RootHubInitContext
= CallbackContext
;
608 PdoExtension
->RootHubInitCallback
= CallbackFunction
;
609 KeReleaseSpinLock(&FdoExtension
->RootHubCallbackSpinLock
, OldIrql
);
611 return STATUS_SUCCESS
;
616 USBHI_FlushTransfers(IN PVOID BusContext
,
617 OUT PUSB_DEVICE_HANDLE UsbdDeviceHandle
)
619 PDEVICE_OBJECT PdoDevice
;
620 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
622 DPRINT("USBHI_FlushTransfers: ... \n");
624 PdoDevice
= BusContext
;
625 PdoExtension
= PdoDevice
->DeviceExtension
;
627 USBPORT_BadRequestFlush(PdoExtension
->FdoDevice
);
632 USBHI_SetDeviceHandleData(IN PVOID BusContext
,
633 IN PVOID DeviceHandle
,
634 IN PDEVICE_OBJECT UsbDevicePdo
)
636 DPRINT1("USBHI_SetDeviceHandleData: UNIMPLEMENTED. FIXME. \n");
639 /* USB bus driver Interface functions */
643 USBDI_GetUSBDIVersion(IN PVOID BusContext
,
644 OUT PUSBD_VERSION_INFORMATION VersionInfo
,
645 OUT PULONG HcdCapabilities
)
647 DPRINT1("USBDI_GetUSBDIVersion: UNIMPLEMENTED. FIXME. \n");
652 USBDI_QueryBusTime(IN PVOID BusContext
,
653 OUT PULONG CurrentFrame
)
655 DPRINT1("USBDI_QueryBusTime: UNIMPLEMENTED. FIXME. \n");
656 return STATUS_SUCCESS
;
661 USBDI_SubmitIsoOutUrb(IN PVOID BusContext
,
664 DPRINT1("USBDI_SubmitIsoOutUrb: UNIMPLEMENTED. FIXME. \n");
665 return STATUS_SUCCESS
;
670 USBDI_QueryBusInformation(IN PVOID BusContext
,
672 OUT PVOID BusInfoBuffer
,
673 OUT PULONG BusInfoBufferLen
,
674 OUT PULONG BusInfoActualLen
)
676 PDEVICE_OBJECT PdoDevice
;
677 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
678 PDEVICE_OBJECT FdoDevice
;
679 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
681 PUSB_BUS_INFORMATION_LEVEL_1 Buffer1
;
683 DPRINT("USBDI_QueryBusInformation: Level - %p\n", Level
);
685 if ((Level
!= 0) && (Level
!= 1))
687 DPRINT1("USBDI_QueryBusInformation: Level should be 0 or 1\n");
688 return STATUS_NOT_SUPPORTED
;
691 PdoDevice
= BusContext
;
692 PdoExtension
= PdoDevice
->DeviceExtension
;
693 FdoDevice
= PdoExtension
->FdoDevice
;
694 FdoExtension
= FdoDevice
->DeviceExtension
;
698 if (BusInfoActualLen
)
699 *BusInfoActualLen
= sizeof(USB_BUS_INFORMATION_LEVEL_0
);
701 if (*BusInfoBufferLen
< sizeof(USB_BUS_INFORMATION_LEVEL_0
))
703 return STATUS_BUFFER_TOO_SMALL
;
706 *BusInfoBufferLen
= sizeof(USB_BUS_INFORMATION_LEVEL_0
);
708 //Buffer0 = BusInfoBuffer;
709 DPRINT1("USBDI_QueryBusInformation: LEVEL_0 UNIMPLEMENTED. FIXME\n");
710 //Buffer0->TotalBandwidth = USBPORT_GetTotalBandwidth();
711 //Buffer0->ConsumedBandwidth = USBPORT_GetAllocatedBandwidth();
713 return STATUS_SUCCESS
;
718 Length
= sizeof(USB_BUS_INFORMATION_LEVEL_1
) +
719 FdoExtension
->CommonExtension
.SymbolicLinkName
.Length
;
721 if (BusInfoActualLen
)
722 *BusInfoActualLen
= Length
;
724 if (*BusInfoBufferLen
< Length
)
726 return STATUS_BUFFER_TOO_SMALL
;
729 *BusInfoBufferLen
= Length
;
731 Buffer1
= BusInfoBuffer
;
732 DPRINT1("USBDI_QueryBusInformation: LEVEL_1 UNIMPLEMENTED. FIXME\n");
733 //Buffer1->TotalBandwidth = USBPORT_GetTotalBandwidth();
734 //Buffer1->ConsumedBandwidth = USBPORT_GetAllocatedBandwidth();
735 Buffer1
->ControllerNameLength
= FdoExtension
->CommonExtension
.SymbolicLinkName
.Length
;
737 RtlCopyMemory(&Buffer1
->ControllerNameUnicodeString
,
738 FdoExtension
->CommonExtension
.SymbolicLinkName
.Buffer
,
739 FdoExtension
->CommonExtension
.SymbolicLinkName
.Length
);
741 return STATUS_SUCCESS
;
744 return STATUS_SUCCESS
;
749 USBDI_IsDeviceHighSpeed(IN PVOID BusContext
)
751 PDEVICE_OBJECT PdoDevice
;
752 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
753 PDEVICE_OBJECT FdoDevice
;
754 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
755 PUSBPORT_REGISTRATION_PACKET Packet
;
757 DPRINT("USBDI_IsDeviceHighSpeed: ... \n");
759 PdoDevice
= BusContext
;
760 PdoExtension
= PdoDevice
->DeviceExtension
;
761 FdoDevice
= PdoExtension
->FdoDevice
;
762 FdoExtension
= FdoDevice
->DeviceExtension
;
763 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
765 return (Packet
->MiniPortFlags
& USB_MINIPORT_FLAGS_USB2
) != 0;
770 USBDI_EnumLogEntry(IN PVOID BusContext
,
776 DPRINT1("USBDI_EnumLogEntry: UNIMPLEMENTED. FIXME. \n");
777 return STATUS_SUCCESS
;
782 USBPORT_PdoQueryInterface(IN PDEVICE_OBJECT FdoDevice
,
783 IN PDEVICE_OBJECT PdoDevice
,
786 PIO_STACK_LOCATION IoStack
= IoGetCurrentIrpStackLocation(Irp
);
787 PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub
;
788 PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI
;
789 UNICODE_STRING GuidBuffer
;
792 DPRINT("USBPORT_PdoQueryInterface: ... \n");
794 if (IsEqualGUIDAligned(IoStack
->Parameters
.QueryInterface
.InterfaceType
,
795 &USB_BUS_INTERFACE_HUB_GUID
))
797 /* Get request parameters */
798 InterfaceHub
= (PUSB_BUS_INTERFACE_HUB_V5
)IoStack
->Parameters
.QueryInterface
.Interface
;
799 InterfaceHub
->Version
= IoStack
->Parameters
.QueryInterface
.Version
;
802 if (IoStack
->Parameters
.QueryInterface
.Version
>= 6)
804 DPRINT1("USB_BUS_INTERFACE_HUB_GUID version %x not supported!\n",
805 IoStack
->Parameters
.QueryInterface
.Version
);
807 return STATUS_NOT_SUPPORTED
; // Version not supported
810 /* Interface version 0 */
811 InterfaceHub
->Size
= IoStack
->Parameters
.QueryInterface
.Size
;
812 InterfaceHub
->BusContext
= PdoDevice
;
814 InterfaceHub
->InterfaceReference
= USBI_InterfaceReference
;
815 InterfaceHub
->InterfaceDereference
= USBI_InterfaceDereference
;
817 /* Interface version 1 */
818 if (IoStack
->Parameters
.QueryInterface
.Version
>= 1)
820 InterfaceHub
->CreateUsbDevice
= USBHI_CreateUsbDevice
;
821 InterfaceHub
->InitializeUsbDevice
= USBHI_InitializeUsbDevice
;
822 InterfaceHub
->GetUsbDescriptors
= USBHI_GetUsbDescriptors
;
823 InterfaceHub
->RemoveUsbDevice
= USBHI_RemoveUsbDevice
;
824 InterfaceHub
->RestoreUsbDevice
= USBHI_RestoreUsbDevice
;
825 InterfaceHub
->QueryDeviceInformation
= USBHI_QueryDeviceInformation
;
828 /* Interface version 2 */
829 if (IoStack
->Parameters
.QueryInterface
.Version
>= 2)
831 InterfaceHub
->GetControllerInformation
= USBHI_GetControllerInformation
;
832 InterfaceHub
->ControllerSelectiveSuspend
= USBHI_ControllerSelectiveSuspend
;
833 InterfaceHub
->GetExtendedHubInformation
= USBHI_GetExtendedHubInformation
;
834 InterfaceHub
->GetRootHubSymbolicName
= USBHI_GetRootHubSymbolicName
;
835 InterfaceHub
->GetDeviceBusContext
= USBHI_GetDeviceBusContext
;
836 InterfaceHub
->Initialize20Hub
= USBHI_Initialize20Hub
;
839 /* Interface version 3 */
840 if (IoStack
->Parameters
.QueryInterface
.Version
>= 3)
841 InterfaceHub
->RootHubInitNotification
= USBHI_RootHubInitNotification
;
843 /* Interface version 4 */
844 if (IoStack
->Parameters
.QueryInterface
.Version
>= 4)
845 InterfaceHub
->FlushTransfers
= USBHI_FlushTransfers
;
847 /* Interface version 5 */
848 if (IoStack
->Parameters
.QueryInterface
.Version
>= 5)
849 InterfaceHub
->SetDeviceHandleData
= USBHI_SetDeviceHandleData
;
851 /* Request completed */
852 return STATUS_SUCCESS
;
854 else if (IsEqualGUIDAligned(IoStack
->Parameters
.QueryInterface
.InterfaceType
,
855 &USB_BUS_INTERFACE_USBDI_GUID
))
857 /* Get request parameters */
858 InterfaceDI
= (PUSB_BUS_INTERFACE_USBDI_V2
)IoStack
->Parameters
.QueryInterface
.Interface
;
859 InterfaceDI
->Version
= IoStack
->Parameters
.QueryInterface
.Version
;
862 if (IoStack
->Parameters
.QueryInterface
.Version
>= 3)
864 DPRINT1("USB_BUS_INTERFACE_USBDI_GUID version %x not supported!\n",
865 IoStack
->Parameters
.QueryInterface
.Version
);
867 return STATUS_NOT_SUPPORTED
; // Version not supported
870 /* Interface version 0 */
871 InterfaceDI
->Size
= IoStack
->Parameters
.QueryInterface
.Size
;
872 InterfaceDI
->BusContext
= PdoDevice
;
873 InterfaceDI
->InterfaceReference
= USBI_InterfaceReference
;
874 InterfaceDI
->InterfaceDereference
= USBI_InterfaceDereference
;
875 InterfaceDI
->GetUSBDIVersion
= USBDI_GetUSBDIVersion
;
876 InterfaceDI
->QueryBusTime
= USBDI_QueryBusTime
;
877 InterfaceDI
->SubmitIsoOutUrb
= USBDI_SubmitIsoOutUrb
;
878 InterfaceDI
->QueryBusInformation
= USBDI_QueryBusInformation
;
880 /* Interface version 1 */
881 if (IoStack
->Parameters
.QueryInterface
.Version
>= 1)
882 InterfaceDI
->IsDeviceHighSpeed
= USBDI_IsDeviceHighSpeed
;
884 /* Interface version 2 */
885 if (IoStack
->Parameters
.QueryInterface
.Version
>= 2)
886 InterfaceDI
->EnumLogEntry
= USBDI_EnumLogEntry
;
888 return STATUS_SUCCESS
;
892 /* Convert GUID to string */
893 Status
= RtlStringFromGUID(IoStack
->Parameters
.QueryInterface
.InterfaceType
,
896 if (NT_SUCCESS(Status
))
898 /* Print interface */
899 DPRINT1("HandleQueryInterface UNKNOWN INTERFACE GUID: %wZ Version %x\n",
901 IoStack
->Parameters
.QueryInterface
.Version
);
903 RtlFreeUnicodeString(&GuidBuffer
); // Free GUID buffer
907 return STATUS_NOT_SUPPORTED
;