2 * Universal Serial Bus Driver/Helper Library
4 * Written by Filip Navara <xnavara@volny.cz>
7 * This driver was obsoleted in Windows XP and most functions
8 * became pure stubs. But some of them were retained for backward
9 * compatibilty with existing drivers.
11 * Preserved functions:
13 * USBD_Debug_GetHeap (implemented)
14 * USBD_Debug_RetHeap (implemented)
15 * USBD_CalculateUsbBandwidth (implemented, tested)
16 * USBD_CreateConfigurationRequestEx (implemented)
17 * USBD_CreateConfigurationRequest
18 * USBD_GetInterfaceLength (implemented)
19 * USBD_ParseConfigurationDescriptorEx
20 * USBD_ParseDescriptors
21 * USBD_GetPdoRegistryParameters (implemented)
25 #include <ddk/usbdi.h>
26 #ifndef PLUGPLAY_REGKEY_DRIVER
27 #define PLUGPLAY_REGKEY_DRIVER 2
29 typedef struct _USBD_INTERFACE_LIST_ENTRY
{
30 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
31 PUSBD_INTERFACE_INFORMATION Interface
;
32 } USBD_INTERFACE_LIST_ENTRY
, *PUSBD_INTERFACE_LIST_ENTRY
;
35 DriverEntry(PDRIVER_OBJECT DriverObject
,
36 PUNICODE_STRING RegistryPath
)
38 return STATUS_SUCCESS
;
45 DllInitialize(DWORD Unknown
)
63 USBD_Debug_GetHeap(DWORD Unknown1
, POOL_TYPE PoolType
, ULONG NumberOfBytes
,
66 return ExAllocatePoolWithTag(PoolType
, NumberOfBytes
, Tag
);
73 USBD_Debug_RetHeap(PVOID Heap
, DWORD Unknown2
, DWORD Unknown3
)
82 USBD_Debug_LogEntry(PCHAR Name
, ULONG_PTR Info1
, ULONG_PTR Info2
,
91 USBD_AllocateDeviceName(DWORD Unknown
)
100 USBD_CalculateUsbBandwidth(
106 DWORD OverheadTable
[] = {
107 0x00, /* UsbdPipeTypeControl */
108 0x09, /* UsbdPipeTypeIsochronous */
109 0x00, /* UsbdPipeTypeBulk */
110 0x0d /* UsbdPipeTypeInterrupt */
114 if (OverheadTable
[EndpointType
] != 0)
116 Result
= ((MaxPacketSize
+ OverheadTable
[EndpointType
]) * 8 * 7) / 6;
128 USBD_Dispatch(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
, DWORD Unknown4
)
137 USBD_FreeDeviceMutex(PVOID Unknown
)
145 USBD_FreeDeviceName(PVOID Unknown
)
153 USBD_WaitDeviceMutex(PVOID Unknown
)
161 USBD_GetSuspendPowerState(DWORD Unknown1
)
170 USBD_InitializeDevice(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
,
171 DWORD Unknown4
, DWORD Unknown5
, DWORD Unknown6
)
173 return STATUS_NOT_SUPPORTED
;
180 USBD_RegisterHostController(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
,
181 DWORD Unknown4
, DWORD Unknown5
, DWORD Unknown6
, DWORD Unknown7
,
182 DWORD Unknown8
, DWORD Unknown9
, DWORD Unknown10
)
184 return STATUS_NOT_SUPPORTED
;
191 USBD_GetDeviceInformation(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
)
193 return STATUS_NOT_SUPPORTED
;
200 USBD_CreateDevice(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
,
201 DWORD Unknown4
, DWORD Unknown5
)
203 return STATUS_NOT_SUPPORTED
;
210 USBD_RemoveDevice(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
)
212 return STATUS_NOT_SUPPORTED
;
219 USBD_CompleteRequest(DWORD Unknown1
, DWORD Unknown2
)
227 USBD_RegisterHcFilter(
228 PDEVICE_OBJECT DeviceObject
,
229 PDEVICE_OBJECT FilterDeviceObject
238 USBD_SetSuspendPowerState(DWORD Unknown1
, DWORD Unknown2
)
246 USBD_MakePdoName(DWORD Unknown1
, DWORD Unknown2
)
248 return STATUS_NOT_SUPPORTED
;
256 PDEVICE_OBJECT RootHubPdo
,
260 return STATUS_NOT_SUPPORTED
;
267 USBD_GetUSBDIVersion(
268 PUSBD_VERSION_INFORMATION Version
273 Version
->USBDI_Version
= USBDI_VERSION
;
274 Version
->Supported_USB_Version
= 0x100;
282 USBD_RestoreDevice(DWORD Unknown1
, DWORD Unknown2
, DWORD Unknown3
)
284 return STATUS_NOT_SUPPORTED
;
291 USBD_RegisterHcDeviceCapabilities(DWORD Unknown1
, DWORD Unknown2
,
302 USBD_CreateConfigurationRequestEx(
303 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
304 PUSBD_INTERFACE_LIST_ENTRY InterfaceList
309 DWORD InterfaceCount
;
311 for (InterfaceCount
= 0;
312 InterfaceList
[InterfaceCount
].InterfaceDescriptor
!= NULL
;
315 /* Include the NULL entry */
318 UrbSize
= sizeof(Urb
->UrbSelectConfiguration
) +
319 (InterfaceCount
* sizeof(PUSBD_INTERFACE_LIST_ENTRY
));
320 Urb
= ExAllocatePool(NonPagedPool
, UrbSize
);
321 Urb
->UrbSelectConfiguration
.Hdr
.Function
=
322 URB_FUNCTION_SELECT_CONFIGURATION
;
323 Urb
->UrbSelectConfiguration
.Hdr
.Length
=
324 sizeof(Urb
->UrbSelectConfiguration
);
325 Urb
->UrbSelectConfiguration
.ConfigurationDescriptor
=
326 ConfigurationDescriptor
;
327 memcpy((PVOID
)&Urb
->UrbSelectConfiguration
.Interface
, (PVOID
)InterfaceList
,
328 InterfaceCount
* sizeof(PUSBD_INTERFACE_LIST_ENTRY
));
337 USBD_CreateConfigurationRequest(
338 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
349 USBD_GetInterfaceLength(
350 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
,
354 PUSB_INTERFACE_DESCRIPTOR CurrentDescriptor
= InterfaceDescriptor
;
355 DWORD Length
= CurrentDescriptor
->bLength
;
357 // USB_ENDPOINT_DESCRIPTOR_TYPE
358 if (CurrentDescriptor
->bDescriptorType
== USB_INTERFACE_DESCRIPTOR_TYPE
)
361 (PUCHAR
)CurrentDescriptor
< BufferEnd
;
362 (PVOID
)CurrentDescriptor
+= CurrentDescriptor
->bLength
)
363 Length
+= CurrentDescriptor
->bLength
;
372 PUSB_INTERFACE_DESCRIPTOR STDCALL
373 USBD_ParseConfigurationDescriptorEx(
374 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
376 LONG InterfaceNumber
,
377 LONG AlternateSetting
,
379 LONG InterfaceSubClass
,
380 LONG InterfaceProtocol
389 PUSB_INTERFACE_DESCRIPTOR STDCALL
390 USBD_ParseConfigurationDescriptor(
391 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
392 UCHAR InterfaceNumber
,
393 UCHAR AlternateSetting
396 return USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
,
397 (PVOID
)ConfigurationDescriptor
, InterfaceNumber
, AlternateSetting
,
404 PUSB_COMMON_DESCRIPTOR STDCALL
405 USBD_ParseDescriptors(
406 PVOID DescriptorBuffer
,
419 USBD_GetPdoRegistryParameter(
420 PDEVICE_OBJECT PhysicalDeviceObject
,
422 ULONG ParameterLength
,
428 HANDLE DevInstRegKey
;
430 Status
= IoOpenDeviceRegistryKey(PhysicalDeviceObject
,
431 PLUGPLAY_REGKEY_DRIVER
, STANDARD_RIGHTS_ALL
, &DevInstRegKey
);
432 if (NT_SUCCESS(Status
))
434 PKEY_VALUE_FULL_INFORMATION FullInfo
;
435 UNICODE_STRING ValueName
;
438 RtlInitUnicodeString(&ValueName
, KeyName
);
439 Length
= ParameterLength
+ KeyNameLength
+ sizeof(KEY_VALUE_FULL_INFORMATION
);
440 FullInfo
= ExAllocatePool(PagedPool
, Length
);
443 Status
= ZwQueryValueKey(DevInstRegKey
, &ValueName
,
444 KeyValueFullInformation
, FullInfo
, Length
, &Length
);
445 if (NT_SUCCESS(Status
))
447 RtlCopyMemory(Parameter
,
448 ((PUCHAR
)FullInfo
) + FullInfo
->DataOffset
,
449 ParameterLength
/*FullInfo->DataLength*/);
451 ExFreePool(FullInfo
);
453 Status
= STATUS_NO_MEMORY
;
454 ZwClose(DevInstRegKey
);