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/usbccgp/descriptor.c
5 * PURPOSE: USB device driver.
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
15 USBCCGP_QueryInterface(
16 IN PDEVICE_OBJECT DeviceObject
,
17 OUT PUSBC_DEVICE_CONFIGURATION_INTERFACE_V1 BusInterface
)
22 IO_STATUS_BLOCK IoStatus
;
23 PIO_STACK_LOCATION Stack
;
28 /* Initialize event */
29 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
32 RtlZeroMemory(BusInterface
, sizeof(USBC_DEVICE_CONFIGURATION_INTERFACE_V1
));
33 BusInterface
->Version
= USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1
;
34 BusInterface
->Size
= sizeof(USBC_DEVICE_CONFIGURATION_INTERFACE_V1
);
37 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_PNP
,
53 return STATUS_INSUFFICIENT_RESOURCES
;
59 Stack
=IoGetNextIrpStackLocation(Irp
);
60 Stack
->MajorFunction
= IRP_MJ_PNP
;
61 Stack
->MinorFunction
= IRP_MN_QUERY_INTERFACE
;
62 Stack
->Parameters
.QueryInterface
.Size
= sizeof(BUS_INTERFACE_STANDARD
);
63 Stack
->Parameters
.QueryInterface
.InterfaceType
= (LPGUID
)&USB_BUS_INTERFACE_USBC_CONFIGURATION_GUID
;
64 Stack
->Parameters
.QueryInterface
.Version
= 2;
65 Stack
->Parameters
.QueryInterface
.Interface
= (PINTERFACE
)&BusInterface
;
66 Stack
->Parameters
.QueryInterface
.InterfaceSpecificData
= NULL
;
67 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
72 Status
= IoCallDriver(DeviceObject
, Irp
);
75 // did operation complete
77 if (Status
== STATUS_PENDING
)
80 // wait for completion
82 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
87 Status
= IoStatus
.Status
;
94 USBCCGP_CustomEnumWithInterface(
95 IN PDEVICE_OBJECT DeviceObject
)
97 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
98 ULONG FunctionDescriptorBufferLength
= 0;
100 PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptorBuffer
= NULL
;
103 // get device extension
105 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
106 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
108 if (FDODeviceExtension
->BusInterface
.StartDeviceCallback
== NULL
)
113 return STATUS_NOT_SUPPORTED
;
119 Status
= FDODeviceExtension
->BusInterface
.StartDeviceCallback(FDODeviceExtension
->DeviceDescriptor
,
120 FDODeviceExtension
->ConfigurationDescriptor
,
121 &FunctionDescriptorBuffer
,
122 &FunctionDescriptorBufferLength
,
124 FDODeviceExtension
->PhysicalDeviceObject
);
126 DPRINT("USBCCGP_CustomEnumWithInterface Status %x\n", Status
);
127 if (!NT_SUCCESS(Status
))
135 DPRINT("FunctionDescriptorBufferLength %lu\n", FunctionDescriptorBufferLength
);
136 DPRINT("FunctionDescriptorBuffer %p\n", FunctionDescriptorBuffer
);
139 // assume length % function buffer size
141 ASSERT(FunctionDescriptorBufferLength
);
142 ASSERT(FunctionDescriptorBufferLength
% sizeof(USBC_FUNCTION_DESCRIPTOR
) == 0);
147 FDODeviceExtension
->FunctionDescriptor
= FunctionDescriptorBuffer
;
148 FDODeviceExtension
->FunctionDescriptorCount
= FunctionDescriptorBufferLength
/ sizeof(USBC_FUNCTION_DESCRIPTOR
);
153 return STATUS_SUCCESS
;
157 USBCCGP_CountAssociationDescriptors(
158 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
)
160 PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR Descriptor
;
167 Offset
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->bLength
;
168 End
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->wTotalLength
;
173 // get association descriptor
175 Descriptor
= (PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR
)Offset
;
177 if (Descriptor
->bLength
== sizeof(USB_INTERFACE_ASSOCIATION_DESCRIPTOR
) && Descriptor
->bDescriptorType
== USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE
)
186 // move to next descriptor
188 Offset
+= Descriptor
->bLength
;
197 PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR
198 USBCCGP_GetAssociationDescriptorAtIndex(
199 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
202 PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR Descriptor
;
209 Offset
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->bLength
;
210 End
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->wTotalLength
;
215 // get association descriptor
217 Descriptor
= (PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR
)Offset
;
219 if (Descriptor
->bLength
== sizeof(USB_INTERFACE_ASSOCIATION_DESCRIPTOR
) && Descriptor
->bDescriptorType
== USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE
)
230 // not the searched one
236 // move to next descriptor
238 Offset
+= Descriptor
->bLength
;
242 // failed to find descriptor at the specified index
248 USBCCGP_InitInterfaceListOfFunctionDescriptor(
249 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
250 IN PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR AssociationDescriptor
,
251 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor
)
253 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
260 Offset
= (PUCHAR
)AssociationDescriptor
+ AssociationDescriptor
->bLength
;
261 End
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->wTotalLength
;
266 // get association descriptor
268 Descriptor
= (PUSB_INTERFACE_DESCRIPTOR
)Offset
;
270 if (Descriptor
->bLength
== sizeof(USB_INTERFACE_DESCRIPTOR
) && Descriptor
->bDescriptorType
== USB_INTERFACE_DESCRIPTOR_TYPE
)
273 // store interface descriptor
275 FunctionDescriptor
->InterfaceDescriptorList
[Count
] = Descriptor
;
278 if (Count
== AssociationDescriptor
->bInterfaceCount
)
281 // got all interfaces
283 return STATUS_SUCCESS
;
287 if (Descriptor
->bLength
== sizeof(USB_INTERFACE_ASSOCIATION_DESCRIPTOR
) && Descriptor
->bDescriptorType
== USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE
)
290 // WTF? a association descriptor which overlaps the next association descriptor
292 DPRINT1("Invalid association descriptor\n");
294 return STATUS_UNSUCCESSFUL
;
298 // move to next descriptor
300 Offset
+= Descriptor
->bLength
;
304 // invalid association descriptor
306 DPRINT1("Invalid association descriptor\n");
307 return STATUS_UNSUCCESSFUL
;
311 USBCCGP_InitFunctionDescriptor(
312 IN PFDO_DEVICE_EXTENSION FDODeviceExtension
,
313 IN ULONG FunctionNumber
,
314 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor
)
316 PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR Descriptor
;
318 LPWSTR DescriptionBuffer
;
322 // init function number
323 FunctionDescriptor
->FunctionNumber
= (UCHAR
)FunctionNumber
;
325 // get association descriptor
326 Descriptor
= USBCCGP_GetAssociationDescriptorAtIndex(FDODeviceExtension
->ConfigurationDescriptor
, FunctionNumber
);
329 // store number interfaces
330 FunctionDescriptor
->NumberOfInterfaces
= Descriptor
->bInterfaceCount
;
332 // allocate array for interface count
333 FunctionDescriptor
->InterfaceDescriptorList
= AllocateItem(NonPagedPool
, sizeof(PUSB_INTERFACE_DESCRIPTOR
) * Descriptor
->bInterfaceCount
);
334 if (FunctionDescriptor
->InterfaceDescriptorList
)
339 return STATUS_INSUFFICIENT_RESOURCES
;
342 // init interface list
343 Status
= USBCCGP_InitInterfaceListOfFunctionDescriptor(FDODeviceExtension
->ConfigurationDescriptor
, Descriptor
, FunctionDescriptor
);
344 if (!NT_SUCCESS(Status
))
353 // now init interface description
355 if (Descriptor
->iFunction
)
358 // get interface description
360 Status
= USBCCGP_GetStringDescriptor(FDODeviceExtension
->NextDeviceObject
,
362 Descriptor
->iFunction
,
364 (PVOID
*)&DescriptionBuffer
);
365 if (!NT_SUCCESS(Status
))
370 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, L
"");
377 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, DescriptionBuffer
);
379 DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor
->FunctionDescription
);
383 // now init hardware id
385 Index
= swprintf(Buffer
, L
"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
386 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
387 FDODeviceExtension
->DeviceDescriptor
->bcdDevice
,
388 Descriptor
->bFirstInterface
) + 1;
389 Index
+= swprintf(&Buffer
[Index
], L
"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
390 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
391 Descriptor
->bFirstInterface
) + 1;
393 // allocate result buffer
394 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
395 if (!DescriptionBuffer
)
398 // failed to allocate memory
400 return STATUS_INSUFFICIENT_RESOURCES
;
404 RtlCopyMemory(DescriptionBuffer
, Buffer
, (Index
+ 1) * sizeof(WCHAR
));
405 FunctionDescriptor
->HardwareId
.Buffer
= DescriptionBuffer
;
406 FunctionDescriptor
->HardwareId
.Length
= Index
* sizeof(WCHAR
);
407 FunctionDescriptor
->HardwareId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
411 // now init the compatible id
413 Index
= swprintf(Buffer
, L
"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor
->bFunctionClass
, Descriptor
->bFunctionSubClass
, Descriptor
->bFunctionProtocol
) + 1;
414 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x&SubClass_%02x", Descriptor
->bFunctionClass
, Descriptor
->bFunctionSubClass
) + 1;
415 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x", Descriptor
->bFunctionClass
) + 1;
417 // allocate result buffer
418 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
419 if (!DescriptionBuffer
)
422 // failed to allocate memory
424 return STATUS_INSUFFICIENT_RESOURCES
;
428 RtlCopyMemory(DescriptionBuffer
, Buffer
, (Index
+ 1) * sizeof(WCHAR
));
429 FunctionDescriptor
->CompatibleId
.Buffer
= DescriptionBuffer
;
430 FunctionDescriptor
->CompatibleId
.Length
= Index
* sizeof(WCHAR
);
431 FunctionDescriptor
->CompatibleId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
436 return STATUS_SUCCESS
;
440 USBCCGP_EnumWithAssociationDescriptor(
441 IN PDEVICE_OBJECT DeviceObject
)
443 ULONG DescriptorCount
, Index
;
444 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
445 NTSTATUS Status
= STATUS_SUCCESS
;
448 // get device extension
450 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
451 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
454 // count association descriptors
456 DescriptorCount
= USBCCGP_CountAssociationDescriptors(FDODeviceExtension
->ConfigurationDescriptor
);
457 if (!DescriptorCount
)
460 // no descriptors found
462 return STATUS_NOT_SUPPORTED
;
466 // allocate function descriptor array
468 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
) * DescriptorCount
);
469 if (!FDODeviceExtension
->FunctionDescriptorCount
)
474 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count %x\n", DescriptorCount
);
475 return STATUS_INSUFFICIENT_RESOURCES
;
478 for(Index
= 0; Index
< DescriptorCount
; Index
++)
481 // init function descriptors
483 Status
= USBCCGP_InitFunctionDescriptor(FDODeviceExtension
, Index
, &FDODeviceExtension
->FunctionDescriptor
[Index
]);
484 if (!NT_SUCCESS(Status
))
494 // store function descriptor count
496 FDODeviceExtension
->FunctionDescriptorCount
= DescriptorCount
;
505 USBCCG_InitIdsWithInterfaceDescriptor(
506 IN PFDO_DEVICE_EXTENSION FDODeviceExtension
,
507 IN PUSB_INTERFACE_DESCRIPTOR Descriptor
,
508 IN ULONG FunctionIndex
,
509 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor
)
513 LPWSTR DescriptionBuffer
;
517 // now init interface description
519 if (Descriptor
->iInterface
)
522 // get interface description
524 Status
= USBCCGP_GetStringDescriptor(FDODeviceExtension
->NextDeviceObject
,
526 Descriptor
->iInterface
,
528 (PVOID
*)&DescriptionBuffer
);
529 if (!NT_SUCCESS(Status
))
534 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, L
"");
541 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, DescriptionBuffer
);
543 DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor
->FunctionDescription
);
548 // now init hardware id
550 Index
= swprintf(Buffer
, L
"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
551 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
552 FDODeviceExtension
->DeviceDescriptor
->bcdDevice
,
554 Index
+= swprintf(&Buffer
[Index
], L
"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
555 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
558 // allocate result buffer
559 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
560 if (!DescriptionBuffer
)
563 // failed to allocate memory
565 return STATUS_INSUFFICIENT_RESOURCES
;
569 RtlCopyMemory(DescriptionBuffer
, Buffer
, (Index
+ 1) * sizeof(WCHAR
));
570 FunctionDescriptor
->HardwareId
.Buffer
= DescriptionBuffer
;
571 FunctionDescriptor
->HardwareId
.Length
= Index
* sizeof(WCHAR
);
572 FunctionDescriptor
->HardwareId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
575 // now init the compatible id
577 Index
= swprintf(Buffer
, L
"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor
->bInterfaceClass
, Descriptor
->bInterfaceSubClass
, Descriptor
->bInterfaceProtocol
) + 1;
578 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x&SubClass_%02x", Descriptor
->bInterfaceClass
, Descriptor
->bInterfaceSubClass
) + 1;
579 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x", Descriptor
->bInterfaceClass
) + 1;
581 // allocate result buffer
582 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
583 if (!DescriptionBuffer
)
586 // failed to allocate memory
588 return STATUS_INSUFFICIENT_RESOURCES
;
592 RtlCopyMemory(DescriptionBuffer
, Buffer
, (Index
+ 1) * sizeof(WCHAR
));
593 FunctionDescriptor
->CompatibleId
.Buffer
= DescriptionBuffer
;
594 FunctionDescriptor
->CompatibleId
.Length
= Index
* sizeof(WCHAR
);
595 FunctionDescriptor
->CompatibleId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
600 return STATUS_SUCCESS
;
606 IN PDEVICE_OBJECT DeviceObject
)
609 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
610 NTSTATUS Status
= STATUS_SUCCESS
;
611 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
614 // get device extension
616 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
617 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
622 ASSERT(FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
625 // allocate function array
627 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
) * FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
628 if (!FDODeviceExtension
->FunctionDescriptor
)
633 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor %lu\n", FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
634 return STATUS_INSUFFICIENT_RESOURCES
;
638 // init function descriptors
640 for(Index
= 0; Index
< FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
; Index
++)
642 // get interface descriptor
643 InterfaceDescriptor
= USBD_ParseConfigurationDescriptorEx(FDODeviceExtension
->ConfigurationDescriptor
, FDODeviceExtension
->ConfigurationDescriptor
, Index
, 0, -1, -1, -1);
644 if (InterfaceDescriptor
== NULL
)
647 // failed to find interface descriptor
649 DPRINT1("[USBCCGP] Failed to find interface descriptor index %lu\n", Index
);
651 return STATUS_UNSUCCESSFUL
;
655 // init function descriptor
657 FDODeviceExtension
->FunctionDescriptor
[Index
].FunctionNumber
= Index
;
658 FDODeviceExtension
->FunctionDescriptor
[Index
].NumberOfInterfaces
= 1;
659 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
= AllocateItem(NonPagedPool
, sizeof(PUSB_INTERFACE_DESCRIPTOR
) * 1);
660 if (!FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
)
665 return STATUS_INSUFFICIENT_RESOURCES
;
669 // store interface descriptor
671 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
[0] = InterfaceDescriptor
;
674 // now init the device ids
676 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, InterfaceDescriptor
, Index
, &FDODeviceExtension
->FunctionDescriptor
[Index
]);
677 if (!NT_SUCCESS(Status
))
680 // failed to init ids
682 DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status
);
687 // store function count
689 FDODeviceExtension
->FunctionDescriptorCount
++;
699 USBCCGP_EnumWithUnionFunctionDescriptors(
700 IN PDEVICE_OBJECT DeviceObject
)
703 return STATUS_NOT_IMPLEMENTED
;
707 USBCCGP_EnumWithAudioLegacy(
708 IN PDEVICE_OBJECT DeviceObject
)
711 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
, FirstDescriptor
= NULL
;
712 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
713 NTSTATUS Status
= STATUS_SUCCESS
;
716 // get device extension
718 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
719 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
723 // first check if all interfaces belong to the same audio class
725 for(Index
= 0; Index
< FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
; Index
++)
728 // get interface descriptor
730 InterfaceDescriptor
= USBD_ParseConfigurationDescriptorEx(FDODeviceExtension
->ConfigurationDescriptor
, FDODeviceExtension
->ConfigurationDescriptor
, Index
, 0, -1, -1, -1);
731 DPRINT1("Index %lu Descriptor %p\n", Index
, InterfaceDescriptor
);
732 ASSERT(InterfaceDescriptor
);
734 if (InterfaceDescriptor
->bInterfaceClass
!= 0x1)
737 // collection contains non audio class
739 return STATUS_UNSUCCESSFUL
;
742 if (FirstDescriptor
== NULL
)
745 // store interface descriptor
747 FirstDescriptor
= InterfaceDescriptor
;
751 if (FirstDescriptor
->bInterfaceSubClass
== InterfaceDescriptor
->bInterfaceSubClass
)
754 // interface subclass must be different from the first interface
756 return STATUS_UNSUCCESSFUL
;
761 // this is an composite audio device
763 DPRINT("[USBCCGP] Audio Composite Device detected\n");
766 // audio interfaces are all grouped into one single function
768 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
));
769 if (!FDODeviceExtension
->FunctionDescriptor
)
774 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count\n");
775 return STATUS_INSUFFICIENT_RESOURCES
;
779 // init function number
781 FDODeviceExtension
->FunctionDescriptor
[0].FunctionNumber
= 0;
786 Status
= AllocateInterfaceDescriptorsArray(FDODeviceExtension
->ConfigurationDescriptor
, &FDODeviceExtension
->FunctionDescriptor
[0].InterfaceDescriptorList
);
787 if (!NT_SUCCESS(Status
))
790 // failed to allocate descriptor array
792 DPRINT1("[USBCCGP] Failed to allocate descriptor array %x\n", Status
);
797 // now init the device ids
799 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, FirstDescriptor
, 0, &FDODeviceExtension
->FunctionDescriptor
[0]);
800 if (!NT_SUCCESS(Status
))
803 // failed to init ids
805 DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status
);
810 // number of interfaces
812 FDODeviceExtension
->FunctionDescriptor
[0].NumberOfInterfaces
= FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
;
815 // store function count
817 FDODeviceExtension
->FunctionDescriptorCount
= 1;
822 return STATUS_SUCCESS
;
826 USBCCGP_EnumerateFunctions(
827 IN PDEVICE_OBJECT DeviceObject
)
830 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
833 // get device extension
835 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
836 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
839 // first try with filter driver
841 Status
= USBCCGP_CustomEnumWithInterface(DeviceObject
);
842 if (NT_SUCCESS(Status
))
851 // enumerate functions with interface association descriptor
853 Status
= USBCCGP_EnumWithAssociationDescriptor(DeviceObject
);
854 if (NT_SUCCESS(Status
))
864 // try with union function descriptors
866 Status
= USBCCGP_EnumWithUnionFunctionDescriptors(DeviceObject
);
867 if (NT_SUCCESS(Status
))
877 // try with legacy audio methods
879 Status
= USBCCGP_EnumWithAudioLegacy(DeviceObject
);
880 if (NT_SUCCESS(Status
))
889 // try with legacy enumeration
891 return USBCCGP_LegacyEnum(DeviceObject
);