8 USBI_InterfaceReference(IN PVOID BusContext
)
10 DPRINT("USBI_InterfaceReference \n");
15 USBI_InterfaceDereference(IN PVOID BusContext
)
17 DPRINT("USBI_InterfaceDereference \n");
20 /* USB port driver Interface functions */
24 USBHI_CreateUsbDevice(IN PVOID BusContext
,
25 IN OUT PUSB_DEVICE_HANDLE
*UsbdDeviceHandle
,
26 IN PUSB_DEVICE_HANDLE UsbdHubDeviceHandle
,
30 PDEVICE_OBJECT PdoDevice
;
31 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
32 PUSB_DEVICE_HANDLE deviceHandle
= NULL
;
35 DPRINT("USBHI_CreateUsbDevice: ... \n");
37 PdoDevice
= BusContext
;
38 PdoExtension
= PdoDevice
->DeviceExtension
;
40 Status
= USBPORT_CreateDevice(&deviceHandle
,
41 PdoExtension
->FdoDevice
,
42 (PUSBPORT_DEVICE_HANDLE
)UsbdHubDeviceHandle
,
46 *UsbdDeviceHandle
= deviceHandle
;
53 USBHI_InitializeUsbDevice(IN PVOID BusContext
,
54 OUT PUSB_DEVICE_HANDLE UsbdDeviceHandle
)
56 PDEVICE_OBJECT PdoDevice
;
57 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
59 DPRINT("USBHI_InitializeUsbDevice \n");
61 PdoDevice
= BusContext
;
62 PdoExtension
= PdoDevice
->DeviceExtension
;
64 return USBPORT_InitializeDevice((PUSBPORT_DEVICE_HANDLE
)UsbdDeviceHandle
,
65 PdoExtension
->FdoDevice
);
70 USBHI_GetUsbDescriptors(IN PVOID BusContext
,
71 IN PUSB_DEVICE_HANDLE UsbdDeviceHandle
,
72 IN PUCHAR DeviceDescBuffer
,
73 IN PULONG DeviceDescBufferLen
,
74 IN PUCHAR ConfigDescBuffer
,
75 IN PULONG ConfigDescBufferLen
)
77 PDEVICE_OBJECT PdoDevice
;
78 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
79 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
83 DPRINT("USBHI_GetUsbDescriptors ...\n");
85 PdoDevice
= BusContext
;
86 PdoExtension
= PdoDevice
->DeviceExtension
;
87 DeviceHandle
= (PUSBPORT_DEVICE_HANDLE
)UsbdDeviceHandle
;
89 if (DeviceDescBuffer
&& *DeviceDescBufferLen
)
91 if (*DeviceDescBufferLen
> sizeof(USB_DEVICE_DESCRIPTOR
))
92 *DeviceDescBufferLen
= sizeof(USB_DEVICE_DESCRIPTOR
);
94 RtlCopyMemory(DeviceDescBuffer
,
95 &DeviceHandle
->DeviceDescriptor
,
96 *DeviceDescBufferLen
);
99 Status
= USBPORT_GetUsbDescriptor(DeviceHandle
,
100 PdoExtension
->FdoDevice
,
101 USB_CONFIGURATION_DESCRIPTOR_TYPE
,
103 ConfigDescBufferLen
);
105 USBPORT_DumpingDeviceDescriptor((PUSB_DEVICE_DESCRIPTOR
)DeviceDescBuffer
);
112 USBHI_RemoveUsbDevice(IN PVOID BusContext
,
113 IN OUT PUSB_DEVICE_HANDLE UsbdDeviceHandle
,
116 PDEVICE_OBJECT PdoDevice
;
117 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
119 DPRINT("USBHI_RemoveUsbDevice: UsbdDeviceHandle - %p, Flags - %x\n",
123 PdoDevice
= BusContext
;
124 PdoExtension
= PdoDevice
->DeviceExtension
;
126 return USBPORT_RemoveDevice(PdoExtension
->FdoDevice
,
127 (PUSBPORT_DEVICE_HANDLE
)UsbdDeviceHandle
,
133 USBHI_RestoreUsbDevice(IN PVOID BusContext
,
134 OUT PUSB_DEVICE_HANDLE OldUsbdDeviceHandle
,
135 OUT PUSB_DEVICE_HANDLE NewUsbdDeviceHandle
)
137 PDEVICE_OBJECT PdoDevice
;
138 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
140 DPRINT("USBHI_RestoreUsbDevice: OldUsbdDeviceHandle - %p, NewUsbdDeviceHandle - %x\n",
142 NewUsbdDeviceHandle
);
144 PdoDevice
= BusContext
;
145 PdoExtension
= PdoDevice
->DeviceExtension
;
147 return USBPORT_RestoreDevice(PdoExtension
->FdoDevice
,
148 (PUSBPORT_DEVICE_HANDLE
)OldUsbdDeviceHandle
,
149 (PUSBPORT_DEVICE_HANDLE
)NewUsbdDeviceHandle
);
154 USBHI_QueryDeviceInformation(IN PVOID BusContext
,
155 IN PUSB_DEVICE_HANDLE UsbdDeviceHandle
,
156 OUT PVOID DeviceInfoBuffer
,
157 IN ULONG DeviceInfoBufferLen
,
158 OUT PULONG LenDataReturned
)
160 PUSB_DEVICE_INFORMATION_0 DeviceInfo
;
161 PUSBPORT_CONFIGURATION_HANDLE ConfigHandle
;
162 PLIST_ENTRY InterfaceEntry
;
163 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
164 ULONG NumberOfOpenPipes
= 0;
165 PUSB_PIPE_INFORMATION_0 PipeInfo
;
166 PUSBPORT_PIPE_HANDLE PipeHandle
;
167 PUSBPORT_INTERFACE_HANDLE InterfaceHandle
;
171 DPRINT("USBHI_QueryDeviceInformation: ... \n");
173 *LenDataReturned
= 0;
175 if (DeviceInfoBufferLen
< sizeof(USB_LEVEL_INFORMATION
))
177 return STATUS_BUFFER_TOO_SMALL
;
180 DeviceInfo
= DeviceInfoBuffer
;
182 if (DeviceInfo
->InformationLevel
> 0)
184 return STATUS_NOT_SUPPORTED
;
187 DeviceHandle
= UsbdDeviceHandle
;
188 ConfigHandle
= DeviceHandle
->ConfigHandle
;
192 InterfaceEntry
= ConfigHandle
->InterfaceHandleList
.Flink
;
194 while (InterfaceEntry
&&
195 InterfaceEntry
!= &ConfigHandle
->InterfaceHandleList
)
197 InterfaceHandle
= CONTAINING_RECORD(InterfaceEntry
,
198 USBPORT_INTERFACE_HANDLE
,
201 NumberOfOpenPipes
+= InterfaceHandle
->InterfaceDescriptor
.bNumEndpoints
;
203 InterfaceEntry
= InterfaceEntry
->Flink
;
207 ActualLength
= sizeof(USB_DEVICE_INFORMATION_0
) +
208 (NumberOfOpenPipes
- 1) * sizeof(USB_PIPE_INFORMATION_0
);
210 if (DeviceInfoBufferLen
< ActualLength
)
212 DeviceInfo
->ActualLength
= ActualLength
;
213 *LenDataReturned
= sizeof(USB_LEVEL_INFORMATION
);
215 return STATUS_BUFFER_TOO_SMALL
;
218 RtlZeroMemory(DeviceInfo
, ActualLength
);
220 DeviceInfo
->InformationLevel
= 0;
221 DeviceInfo
->ActualLength
= ActualLength
;
222 DeviceInfo
->DeviceAddress
= DeviceHandle
->DeviceAddress
;
223 DeviceInfo
->NumberOfOpenPipes
= NumberOfOpenPipes
;
224 DeviceInfo
->DeviceSpeed
= DeviceHandle
->DeviceSpeed
;
226 RtlCopyMemory(&DeviceInfo
->DeviceDescriptor
,
227 &DeviceHandle
->DeviceDescriptor
,
228 sizeof(USB_DEVICE_DESCRIPTOR
));
230 USBPORT_DumpingDeviceDescriptor(&DeviceInfo
->DeviceDescriptor
);
232 if (DeviceHandle
->DeviceSpeed
== UsbFullSpeed
||
233 DeviceHandle
->DeviceSpeed
== UsbLowSpeed
)
235 DeviceInfo
->DeviceType
= Usb11Device
;
237 else if (DeviceHandle
->DeviceSpeed
== UsbHighSpeed
)
239 DeviceInfo
->DeviceType
= Usb20Device
;
242 DeviceInfo
->CurrentConfigurationValue
= 0;
246 *LenDataReturned
= ActualLength
;
247 return STATUS_SUCCESS
;
250 DeviceInfo
->CurrentConfigurationValue
=
251 ConfigHandle
->ConfigurationDescriptor
->bConfigurationValue
;
253 InterfaceEntry
= ConfigHandle
->InterfaceHandleList
.Flink
;
255 while (InterfaceEntry
&&
256 InterfaceEntry
!= &ConfigHandle
->InterfaceHandleList
)
258 InterfaceHandle
= CONTAINING_RECORD(InterfaceEntry
,
259 USBPORT_INTERFACE_HANDLE
,
262 if (InterfaceHandle
->InterfaceDescriptor
.bNumEndpoints
> 0)
264 PipeInfo
= &DeviceInfo
->PipeList
[0];
265 PipeHandle
= &InterfaceHandle
->PipeHandle
[0];
268 ix
< InterfaceHandle
->InterfaceDescriptor
.bNumEndpoints
;
271 if (PipeHandle
->Flags
& PIPE_HANDLE_FLAG_NULL_PACKET_SIZE
)
273 PipeInfo
->ScheduleOffset
= 1;
277 PipeInfo
->ScheduleOffset
=
278 PipeHandle
->Endpoint
->EndpointProperties
.ScheduleOffset
;
281 RtlCopyMemory(&PipeInfo
->EndpointDescriptor
,
282 &PipeHandle
->EndpointDescriptor
,
283 sizeof(USB_ENDPOINT_DESCRIPTOR
));
290 InterfaceEntry
= InterfaceEntry
->Flink
;
293 *LenDataReturned
= ActualLength
;
295 return STATUS_SUCCESS
;
300 USBHI_GetControllerInformation(IN PVOID BusContext
,
301 OUT PVOID ControllerInfoBuffer
,
302 IN ULONG ControllerInfoBufferLen
,
303 OUT PULONG LenDataReturned
)
305 PDEVICE_OBJECT PdoDevice
;
306 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
307 PDEVICE_OBJECT FdoDevice
;
308 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
309 PUSB_CONTROLLER_INFORMATION_0 InfoBuffer
;
312 DPRINT("USBHI_GetControllerInformation: ControllerInfoBufferLen - %x\n",
313 ControllerInfoBufferLen
);
315 PdoDevice
= BusContext
;
316 PdoExtension
= PdoDevice
->DeviceExtension
;
317 FdoDevice
= PdoExtension
->FdoDevice
;
318 FdoExtension
= FdoDevice
->DeviceExtension
;
320 InfoBuffer
= ControllerInfoBuffer
;
322 *LenDataReturned
= 0;
324 if (ControllerInfoBufferLen
< sizeof(USB_LEVEL_INFORMATION
))
326 Status
= STATUS_BUFFER_TOO_SMALL
;
330 *LenDataReturned
= sizeof(USB_LEVEL_INFORMATION
);
332 if (InfoBuffer
->InformationLevel
> 0)
334 Status
= STATUS_NOT_SUPPORTED
;
338 InfoBuffer
->ActualLength
= sizeof(USB_CONTROLLER_INFORMATION_0
);
340 if (ControllerInfoBufferLen
>= sizeof(USB_CONTROLLER_INFORMATION_0
))
342 InfoBuffer
->SelectiveSuspendEnabled
=
343 (FdoExtension
->Flags
& USBPORT_FLAG_SELECTIVE_SUSPEND
) ==
344 USBPORT_FLAG_SELECTIVE_SUSPEND
;
347 *LenDataReturned
= sizeof(USB_CONTROLLER_INFORMATION_0
);
349 return STATUS_SUCCESS
;
354 USBHI_ControllerSelectiveSuspend(IN PVOID BusContext
,
357 PDEVICE_OBJECT PdoDevice
;
358 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
359 PDEVICE_OBJECT FdoDevice
;
360 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
365 DPRINT("USBHI_ControllerSelectiveSuspend: Enable - %x\n", Enable
);
367 PdoDevice
= BusContext
;
368 PdoExtension
= PdoDevice
->DeviceExtension
;
369 FdoDevice
= PdoExtension
->FdoDevice
;
370 FdoExtension
= FdoDevice
->DeviceExtension
;
372 Flags
= FdoExtension
->Flags
;
374 if (Flags
& USBPORT_FLAG_BIOS_DISABLE_SS
)
376 return STATUS_SUCCESS
;
381 FdoExtension
->Flags
|= USBPORT_FLAG_SELECTIVE_SUSPEND
;
386 FdoExtension
->Flags
&= ~USBPORT_FLAG_SELECTIVE_SUSPEND
;
390 Status
= USBPORT_SetRegistryKeyValue(FdoExtension
->CommonExtension
.LowerPdoDevice
,
393 L
"HcDisableSelectiveSuspend",
397 if (NT_SUCCESS(Status
))
400 FdoExtension
->Flags
|= USBPORT_FLAG_SELECTIVE_SUSPEND
;
402 FdoExtension
->Flags
&= ~USBPORT_FLAG_SELECTIVE_SUSPEND
;
410 USBHI_GetExtendedHubInformation(IN PVOID BusContext
,
411 IN PDEVICE_OBJECT HubPhysicalDeviceObject
,
412 IN OUT PVOID HubInformationBuffer
,
414 IN OUT PULONG LenDataReturned
)
416 PDEVICE_OBJECT PdoDevice
;
417 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
418 PDEVICE_OBJECT FdoDevice
;
419 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
420 PUSBPORT_REGISTRATION_PACKET Packet
;
423 PUSB_EXTHUB_INFORMATION_0 HubInfoBuffer
;
424 USB_PORT_STATUS_AND_CHANGE PortStatus
;
427 DPRINT("USBHI_GetExtendedHubInformation: ... \n");
429 PdoDevice
= BusContext
;
430 PdoExtension
= PdoDevice
->DeviceExtension
;
431 FdoDevice
= PdoExtension
->FdoDevice
;
432 FdoExtension
= FdoDevice
->DeviceExtension
;
433 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
435 HubInfoBuffer
= HubInformationBuffer
;
436 PortStatus
.AsUlong32
= 0;
438 if (HubPhysicalDeviceObject
!= PdoDevice
)
440 *LenDataReturned
= 0;
441 return STATUS_NOT_SUPPORTED
;
444 if (HubInfoLen
< sizeof(USB_EXTHUB_INFORMATION_0
))
446 *LenDataReturned
= 0;
447 return STATUS_BUFFER_TOO_SMALL
;
450 NumPorts
= PdoExtension
->RootHubDescriptors
->Descriptor
.bNumberOfPorts
;
451 HubInfoBuffer
->NumberOfPorts
= NumPorts
;
455 *LenDataReturned
= sizeof(USB_EXTHUB_INFORMATION_0
);
456 return STATUS_SUCCESS
;
459 for (ix
= 0; ix
< HubInfoBuffer
->NumberOfPorts
; ++ix
)
461 HubInfoBuffer
->Port
[ix
].PhysicalPortNumber
= ix
+ 1;
462 HubInfoBuffer
->Port
[ix
].PortLabelNumber
= ix
;
463 HubInfoBuffer
->Port
[ix
].VidOverride
= 0;
464 HubInfoBuffer
->Port
[ix
].PidOverride
= 0;
465 HubInfoBuffer
->Port
[ix
].PortAttributes
= 0;
467 if (Packet
->MiniPortFlags
& USB_MINIPORT_FLAGS_USB2
)
469 HubInfoBuffer
->Port
[ix
].PortAttributes
= USB_PORTATTR_SHARED_USB2
;
471 Packet
->RH_GetPortStatus(FdoExtension
->MiniPortExt
,
475 if (PortStatus
.PortStatus
.Usb20PortStatus
.AsUshort16
& 0x8000)
477 HubInfoBuffer
->Port
[ix
].PortAttributes
|= USB_PORTATTR_OWNED_BY_CC
;
482 if (!(FdoExtension
->Flags
& USBPORT_FLAG_COMPANION_HC
))
487 if (USBPORT_FindUSB2Controller(FdoDevice
))
489 HubInfoBuffer
->Port
[ix
].PortAttributes
|= USB_PORTATTR_NO_OVERCURRENT_UI
;
494 for (ix
= 0; ix
< HubInfoBuffer
->NumberOfPorts
; ++ix
)
498 USBPORT_GetRegistryKeyValueFullInfo(FdoDevice
,
499 FdoExtension
->CommonExtension
.LowerPdoDevice
,
502 sizeof(L
"PortAttrX"),
506 HubInfoBuffer
->Port
[ix
].PortAttributes
|= PortAttrX
;
509 *LenDataReturned
= sizeof(USB_EXTHUB_INFORMATION_0
);
511 return STATUS_SUCCESS
;
516 USBHI_GetRootHubSymbolicName(IN PVOID BusContext
,
517 IN OUT PVOID HubInfoBuffer
,
518 IN ULONG HubInfoBufferLen
,
519 OUT PULONG HubNameActualLen
)
521 PDEVICE_OBJECT PdoDevice
;
522 UNICODE_STRING HubName
;
523 PUNICODE_STRING InfoBuffer
;
526 DPRINT("USBHI_GetRootHubSymbolicName: ... \n");
528 PdoDevice
= BusContext
;
530 Status
= USBPORT_GetSymbolicName(PdoDevice
, &HubName
);
532 if (HubInfoBufferLen
< HubName
.Length
)
534 InfoBuffer
= HubInfoBuffer
;
535 InfoBuffer
->Length
= 0;
539 RtlCopyMemory(HubInfoBuffer
, HubName
.Buffer
, HubName
.Length
);
542 *HubNameActualLen
= HubName
.Length
;
544 if (NT_SUCCESS(Status
))
545 RtlFreeUnicodeString(&HubName
);
552 USBHI_GetDeviceBusContext(IN PVOID BusContext
,
553 IN PVOID DeviceHandle
)
555 DPRINT1("USBHI_GetDeviceBusContext: UNIMPLEMENTED. FIXME. \n");
561 USBHI_Initialize20Hub(IN PVOID BusContext
,
562 IN PUSB_DEVICE_HANDLE UsbdHubDeviceHandle
,
565 PDEVICE_OBJECT PdoDevice
;
566 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
568 DPRINT("USBHI_Initialize20Hub: UsbdHubDeviceHandle - %p, TtCount - %x\n",
572 PdoDevice
= BusContext
;
573 PdoExtension
= PdoDevice
->DeviceExtension
;
575 return USBPORT_Initialize20Hub(PdoExtension
->FdoDevice
,
576 (PUSBPORT_DEVICE_HANDLE
)UsbdHubDeviceHandle
,
582 USBHI_RootHubInitNotification(IN PVOID BusContext
,
583 IN PVOID CallbackContext
,
584 IN PRH_INIT_CALLBACK CallbackFunction
)
586 PDEVICE_OBJECT PdoDevice
;
587 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
588 PDEVICE_OBJECT FdoDevice
;
589 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
592 DPRINT("USBHI_RootHubInitNotification \n");
594 PdoDevice
= BusContext
;
595 PdoExtension
= PdoDevice
->DeviceExtension
;
596 FdoDevice
= PdoExtension
->FdoDevice
;
597 FdoExtension
= FdoDevice
->DeviceExtension
;
599 KeAcquireSpinLock(&FdoExtension
->RootHubCallbackSpinLock
, &OldIrql
);
600 PdoExtension
->RootHubInitContext
= CallbackContext
;
601 PdoExtension
->RootHubInitCallback
= CallbackFunction
;
602 KeReleaseSpinLock(&FdoExtension
->RootHubCallbackSpinLock
, OldIrql
);
604 return STATUS_SUCCESS
;
609 USBHI_FlushTransfers(IN PVOID BusContext
,
610 OUT PUSB_DEVICE_HANDLE UsbdDeviceHandle
)
612 PDEVICE_OBJECT PdoDevice
;
613 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
615 DPRINT("USBHI_FlushTransfers: ... \n");
617 PdoDevice
= BusContext
;
618 PdoExtension
= PdoDevice
->DeviceExtension
;
620 USBPORT_BadRequestFlush(PdoExtension
->FdoDevice
);
625 USBHI_SetDeviceHandleData(IN PVOID BusContext
,
626 IN PVOID DeviceHandle
,
627 IN PDEVICE_OBJECT UsbDevicePdo
)
629 DPRINT1("USBHI_SetDeviceHandleData: UNIMPLEMENTED. FIXME. \n");
632 /* USB bus driver Interface functions */
636 USBDI_GetUSBDIVersion(IN PVOID BusContext
,
637 OUT PUSBD_VERSION_INFORMATION VersionInfo
,
638 OUT PULONG HcdCapabilities
)
640 DPRINT1("USBDI_GetUSBDIVersion: UNIMPLEMENTED. FIXME. \n");
645 USBDI_QueryBusTime(IN PVOID BusContext
,
646 OUT PULONG CurrentFrame
)
648 DPRINT1("USBDI_QueryBusTime: UNIMPLEMENTED. FIXME. \n");
649 return STATUS_SUCCESS
;
654 USBDI_SubmitIsoOutUrb(IN PVOID BusContext
,
657 DPRINT1("USBDI_SubmitIsoOutUrb: UNIMPLEMENTED. FIXME. \n");
658 return STATUS_SUCCESS
;
663 USBDI_QueryBusInformation(IN PVOID BusContext
,
665 OUT PVOID BusInfoBuffer
,
666 OUT PULONG BusInfoBufferLen
,
667 OUT PULONG BusInfoActualLen
)
669 PDEVICE_OBJECT PdoDevice
;
670 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
671 PDEVICE_OBJECT FdoDevice
;
672 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
674 PUSB_BUS_INFORMATION_LEVEL_1 Buffer1
;
676 DPRINT("USBDI_QueryBusInformation: Level - %p\n", Level
);
678 if ((Level
!= 0) || (Level
!= 1))
680 DPRINT1("USBDI_QueryBusInformation: Level should be 0 or 1\n");
681 return STATUS_NOT_SUPPORTED
;
684 PdoDevice
= BusContext
;
685 PdoExtension
= PdoDevice
->DeviceExtension
;
686 FdoDevice
= PdoExtension
->FdoDevice
;
687 FdoExtension
= FdoDevice
->DeviceExtension
;
691 if (BusInfoActualLen
)
692 *BusInfoActualLen
= sizeof(USB_BUS_INFORMATION_LEVEL_0
);
694 if (*BusInfoBufferLen
< sizeof(USB_BUS_INFORMATION_LEVEL_0
))
696 return STATUS_BUFFER_TOO_SMALL
;
699 *BusInfoBufferLen
= sizeof(USB_BUS_INFORMATION_LEVEL_0
);
701 //Buffer0 = BusInfoBuffer;
702 DPRINT1("USBDI_QueryBusInformation: LEVEL_0 UNIMPLEMENTED. FIXME\n");
703 //Buffer0->TotalBandwidth = USBPORT_GetTotalBandwidth();
704 //Buffer0->ConsumedBandwidth = USBPORT_GetAllocatedBandwidth();
706 return STATUS_SUCCESS
;
711 Length
= sizeof(USB_BUS_INFORMATION_LEVEL_1
) +
712 FdoExtension
->CommonExtension
.SymbolicLinkName
.Length
;
714 if (BusInfoActualLen
)
715 *BusInfoActualLen
= Length
;
717 if (*BusInfoBufferLen
< Length
)
719 return STATUS_BUFFER_TOO_SMALL
;
722 *BusInfoBufferLen
= Length
;
724 Buffer1
= BusInfoBuffer
;
725 DPRINT1("USBDI_QueryBusInformation: LEVEL_1 UNIMPLEMENTED. FIXME\n");
726 //Buffer1->TotalBandwidth = USBPORT_GetTotalBandwidth();
727 //Buffer1->ConsumedBandwidth = USBPORT_GetAllocatedBandwidth();
728 Buffer1
->ControllerNameLength
= FdoExtension
->CommonExtension
.SymbolicLinkName
.Length
;
730 RtlCopyMemory(&Buffer1
->ControllerNameUnicodeString
,
731 FdoExtension
->CommonExtension
.SymbolicLinkName
.Buffer
,
732 FdoExtension
->CommonExtension
.SymbolicLinkName
.Length
);
734 return STATUS_SUCCESS
;
737 return STATUS_SUCCESS
;
742 USBDI_IsDeviceHighSpeed(IN PVOID BusContext
)
744 PDEVICE_OBJECT PdoDevice
;
745 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
746 PDEVICE_OBJECT FdoDevice
;
747 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
748 PUSBPORT_REGISTRATION_PACKET Packet
;
750 DPRINT("USBDI_IsDeviceHighSpeed: ... \n");
752 PdoDevice
= BusContext
;
753 PdoExtension
= PdoDevice
->DeviceExtension
;
754 FdoDevice
= PdoExtension
->FdoDevice
;
755 FdoExtension
= FdoDevice
->DeviceExtension
;
756 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
758 return (Packet
->MiniPortFlags
& USB_MINIPORT_FLAGS_USB2
) != 0;
763 USBDI_EnumLogEntry(IN PVOID BusContext
,
769 DPRINT1("USBDI_EnumLogEntry: UNIMPLEMENTED. FIXME. \n");
770 return STATUS_SUCCESS
;
775 USBPORT_PdoQueryInterface(IN PDEVICE_OBJECT FdoDevice
,
776 IN PDEVICE_OBJECT PdoDevice
,
779 PIO_STACK_LOCATION IoStack
= IoGetCurrentIrpStackLocation(Irp
);
780 PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub
;
781 PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI
;
782 UNICODE_STRING GuidBuffer
;
785 DPRINT("USBPORT_PdoQueryInterface: ... \n");
787 if (IsEqualGUIDAligned(IoStack
->Parameters
.QueryInterface
.InterfaceType
,
788 &USB_BUS_INTERFACE_HUB_GUID
))
790 /* Get request parameters */
791 InterfaceHub
= (PUSB_BUS_INTERFACE_HUB_V5
)IoStack
->Parameters
.QueryInterface
.Interface
;
792 InterfaceHub
->Version
= IoStack
->Parameters
.QueryInterface
.Version
;
795 if (IoStack
->Parameters
.QueryInterface
.Version
>= 6)
797 DPRINT1("USB_BUS_INTERFACE_HUB_GUID version %x not supported!\n",
798 IoStack
->Parameters
.QueryInterface
.Version
);
800 return STATUS_NOT_SUPPORTED
; // Version not supported
803 /* Interface version 0 */
804 InterfaceHub
->Size
= IoStack
->Parameters
.QueryInterface
.Size
;
805 InterfaceHub
->BusContext
= PdoDevice
;
807 InterfaceHub
->InterfaceReference
= USBI_InterfaceReference
;
808 InterfaceHub
->InterfaceDereference
= USBI_InterfaceDereference
;
810 /* Interface version 1 */
811 if (IoStack
->Parameters
.QueryInterface
.Version
>= 1)
813 InterfaceHub
->CreateUsbDevice
= USBHI_CreateUsbDevice
;
814 InterfaceHub
->InitializeUsbDevice
= USBHI_InitializeUsbDevice
;
815 InterfaceHub
->GetUsbDescriptors
= USBHI_GetUsbDescriptors
;
816 InterfaceHub
->RemoveUsbDevice
= USBHI_RemoveUsbDevice
;
817 InterfaceHub
->RestoreUsbDevice
= USBHI_RestoreUsbDevice
;
818 InterfaceHub
->QueryDeviceInformation
= USBHI_QueryDeviceInformation
;
821 /* Interface version 2 */
822 if (IoStack
->Parameters
.QueryInterface
.Version
>= 2)
824 InterfaceHub
->GetControllerInformation
= USBHI_GetControllerInformation
;
825 InterfaceHub
->ControllerSelectiveSuspend
= USBHI_ControllerSelectiveSuspend
;
826 InterfaceHub
->GetExtendedHubInformation
= USBHI_GetExtendedHubInformation
;
827 InterfaceHub
->GetRootHubSymbolicName
= USBHI_GetRootHubSymbolicName
;
828 InterfaceHub
->GetDeviceBusContext
= USBHI_GetDeviceBusContext
;
829 InterfaceHub
->Initialize20Hub
= USBHI_Initialize20Hub
;
832 /* Interface version 3 */
833 if (IoStack
->Parameters
.QueryInterface
.Version
>= 3)
834 InterfaceHub
->RootHubInitNotification
= USBHI_RootHubInitNotification
;
836 /* Interface version 4 */
837 if (IoStack
->Parameters
.QueryInterface
.Version
>= 4)
838 InterfaceHub
->FlushTransfers
= USBHI_FlushTransfers
;
840 /* Interface version 5 */
841 if (IoStack
->Parameters
.QueryInterface
.Version
>= 5)
842 InterfaceHub
->SetDeviceHandleData
= USBHI_SetDeviceHandleData
;
844 /* Request completed */
845 return STATUS_SUCCESS
;
847 else if (IsEqualGUIDAligned(IoStack
->Parameters
.QueryInterface
.InterfaceType
,
848 &USB_BUS_INTERFACE_USBDI_GUID
))
850 /* Get request parameters */
851 InterfaceDI
= (PUSB_BUS_INTERFACE_USBDI_V2
)IoStack
->Parameters
.QueryInterface
.Interface
;
852 InterfaceDI
->Version
= IoStack
->Parameters
.QueryInterface
.Version
;
855 if (IoStack
->Parameters
.QueryInterface
.Version
>= 3)
857 DPRINT1("USB_BUS_INTERFACE_USBDI_GUID version %x not supported!\n",
858 IoStack
->Parameters
.QueryInterface
.Version
);
860 return STATUS_NOT_SUPPORTED
; // Version not supported
863 /* Interface version 0 */
864 InterfaceDI
->Size
= IoStack
->Parameters
.QueryInterface
.Size
;
865 InterfaceDI
->BusContext
= PdoDevice
;
866 InterfaceDI
->InterfaceReference
= USBI_InterfaceReference
;
867 InterfaceDI
->InterfaceDereference
= USBI_InterfaceDereference
;
868 InterfaceDI
->GetUSBDIVersion
= USBDI_GetUSBDIVersion
;
869 InterfaceDI
->QueryBusTime
= USBDI_QueryBusTime
;
870 InterfaceDI
->SubmitIsoOutUrb
= USBDI_SubmitIsoOutUrb
;
871 InterfaceDI
->QueryBusInformation
= USBDI_QueryBusInformation
;
873 /* Interface version 1 */
874 if (IoStack
->Parameters
.QueryInterface
.Version
>= 1)
875 InterfaceDI
->IsDeviceHighSpeed
= USBDI_IsDeviceHighSpeed
;
877 /* Interface version 2 */
878 if (IoStack
->Parameters
.QueryInterface
.Version
>= 2)
879 InterfaceDI
->EnumLogEntry
= USBDI_EnumLogEntry
;
881 return STATUS_SUCCESS
;
885 /* Convert GUID to string */
886 Status
= RtlStringFromGUID(IoStack
->Parameters
.QueryInterface
.InterfaceType
,
889 if (NT_SUCCESS(Status
))
891 /* Print interface */
892 DPRINT1("HandleQueryInterface UNKNOWN INTERFACE GUID: %wZ Version %x\n",
894 IoStack
->Parameters
.QueryInterface
.Version
);
896 RtlFreeUnicodeString(&GuidBuffer
); // Free GUID buffer
900 return STATUS_NOT_SUPPORTED
;