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 %lx\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
);
410 // now init the compatible id
412 Index
= swprintf(Buffer
, L
"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor
->bFunctionClass
, Descriptor
->bFunctionSubClass
, Descriptor
->bFunctionProtocol
) + 1;
413 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x&SubClass_%02x", Descriptor
->bFunctionClass
, Descriptor
->bFunctionSubClass
) + 1;
414 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x", Descriptor
->bFunctionClass
) + 1;
416 // allocate result buffer
417 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
418 if (!DescriptionBuffer
)
421 // failed to allocate memory
423 return STATUS_INSUFFICIENT_RESOURCES
;
427 RtlCopyMemory(DescriptionBuffer
, Buffer
, (Index
+ 1) * sizeof(WCHAR
));
428 FunctionDescriptor
->CompatibleId
.Buffer
= DescriptionBuffer
;
429 FunctionDescriptor
->CompatibleId
.Length
= Index
* sizeof(WCHAR
);
430 FunctionDescriptor
->CompatibleId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
435 return STATUS_SUCCESS
;
439 USBCCGP_EnumWithAssociationDescriptor(
440 IN PDEVICE_OBJECT DeviceObject
)
442 ULONG DescriptorCount
, Index
;
443 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
444 NTSTATUS Status
= STATUS_SUCCESS
;
447 // get device extension
449 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
450 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
453 // count association descriptors
455 DescriptorCount
= USBCCGP_CountAssociationDescriptors(FDODeviceExtension
->ConfigurationDescriptor
);
456 if (!DescriptorCount
)
459 // no descriptors found
461 return STATUS_NOT_SUPPORTED
;
465 // allocate function descriptor array
467 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
) * DescriptorCount
);
468 if (!FDODeviceExtension
->FunctionDescriptor
)
473 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count %x\n", DescriptorCount
);
474 return STATUS_INSUFFICIENT_RESOURCES
;
477 for (Index
= 0; Index
< DescriptorCount
; Index
++)
480 // init function descriptors
482 Status
= USBCCGP_InitFunctionDescriptor(FDODeviceExtension
, Index
, &FDODeviceExtension
->FunctionDescriptor
[Index
]);
483 if (!NT_SUCCESS(Status
))
493 // store function descriptor count
495 FDODeviceExtension
->FunctionDescriptorCount
= DescriptorCount
;
504 USBCCG_InitIdsWithInterfaceDescriptor(
505 IN PFDO_DEVICE_EXTENSION FDODeviceExtension
,
506 IN PUSB_INTERFACE_DESCRIPTOR Descriptor
,
507 IN ULONG FunctionIndex
,
508 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor
)
512 LPWSTR DescriptionBuffer
;
516 // now init interface description
518 if (Descriptor
->iInterface
)
521 // get interface description
523 Status
= USBCCGP_GetStringDescriptor(FDODeviceExtension
->NextDeviceObject
,
525 Descriptor
->iInterface
,
527 (PVOID
*)&DescriptionBuffer
);
528 if (!NT_SUCCESS(Status
))
533 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, L
"");
540 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, DescriptionBuffer
);
542 DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor
->FunctionDescription
);
547 // now init hardware id
549 Index
= swprintf(Buffer
, L
"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
550 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
551 FDODeviceExtension
->DeviceDescriptor
->bcdDevice
,
553 Index
+= swprintf(&Buffer
[Index
], L
"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
554 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
557 // allocate result buffer
558 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
559 if (!DescriptionBuffer
)
562 // failed to allocate memory
564 return STATUS_INSUFFICIENT_RESOURCES
;
568 RtlCopyMemory(DescriptionBuffer
, Buffer
, (Index
+ 1) * sizeof(WCHAR
));
569 FunctionDescriptor
->HardwareId
.Buffer
= DescriptionBuffer
;
570 FunctionDescriptor
->HardwareId
.Length
= Index
* sizeof(WCHAR
);
571 FunctionDescriptor
->HardwareId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
574 // now init the compatible id
576 Index
= swprintf(Buffer
, L
"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor
->bInterfaceClass
, Descriptor
->bInterfaceSubClass
, Descriptor
->bInterfaceProtocol
) + 1;
577 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x&SubClass_%02x", Descriptor
->bInterfaceClass
, Descriptor
->bInterfaceSubClass
) + 1;
578 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x", Descriptor
->bInterfaceClass
) + 1;
580 // allocate result buffer
581 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
582 if (!DescriptionBuffer
)
585 // failed to allocate memory
587 return STATUS_INSUFFICIENT_RESOURCES
;
591 RtlCopyMemory(DescriptionBuffer
, Buffer
, (Index
+ 1) * sizeof(WCHAR
));
592 FunctionDescriptor
->CompatibleId
.Buffer
= DescriptionBuffer
;
593 FunctionDescriptor
->CompatibleId
.Length
= Index
* sizeof(WCHAR
);
594 FunctionDescriptor
->CompatibleId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
599 return STATUS_SUCCESS
;
605 IN PDEVICE_OBJECT DeviceObject
)
608 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
609 NTSTATUS Status
= STATUS_SUCCESS
;
610 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
613 // get device extension
615 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
616 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
621 ASSERT(FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
624 // allocate function array
626 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
) * FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
627 if (!FDODeviceExtension
->FunctionDescriptor
)
632 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor %lu\n", FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
633 return STATUS_INSUFFICIENT_RESOURCES
;
637 // init function descriptors
639 for (Index
= 0; Index
< FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
; Index
++)
641 // get interface descriptor
642 InterfaceDescriptor
= USBD_ParseConfigurationDescriptorEx(FDODeviceExtension
->ConfigurationDescriptor
, FDODeviceExtension
->ConfigurationDescriptor
, Index
, 0, -1, -1, -1);
643 if (InterfaceDescriptor
== NULL
)
646 // failed to find interface descriptor
648 DPRINT1("[USBCCGP] Failed to find interface descriptor index %lu\n", Index
);
650 return STATUS_UNSUCCESSFUL
;
654 // init function descriptor
656 FDODeviceExtension
->FunctionDescriptor
[Index
].FunctionNumber
= Index
;
657 FDODeviceExtension
->FunctionDescriptor
[Index
].NumberOfInterfaces
= 1;
658 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
= AllocateItem(NonPagedPool
, sizeof(PUSB_INTERFACE_DESCRIPTOR
) * 1);
659 if (!FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
)
664 return STATUS_INSUFFICIENT_RESOURCES
;
668 // store interface descriptor
670 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
[0] = InterfaceDescriptor
;
673 // now init the device ids
675 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, InterfaceDescriptor
, Index
, &FDODeviceExtension
->FunctionDescriptor
[Index
]);
676 if (!NT_SUCCESS(Status
))
679 // failed to init ids
681 DPRINT1("[USBCCGP] Failed to init ids with %lx\n", Status
);
686 // store function count
688 FDODeviceExtension
->FunctionDescriptorCount
++;
698 USBCCGP_EnumWithUnionFunctionDescriptors(
699 IN PDEVICE_OBJECT DeviceObject
)
702 return STATUS_NOT_IMPLEMENTED
;
706 USBCCGP_EnumWithAudioLegacy(
707 IN PDEVICE_OBJECT DeviceObject
)
710 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
, FirstDescriptor
= NULL
;
711 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
712 NTSTATUS Status
= STATUS_SUCCESS
;
715 // get device extension
717 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
718 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
722 // first check if all interfaces belong to the same audio class
724 for (Index
= 0; Index
< FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
; Index
++)
727 // get interface descriptor
729 InterfaceDescriptor
= USBD_ParseConfigurationDescriptorEx(FDODeviceExtension
->ConfigurationDescriptor
, FDODeviceExtension
->ConfigurationDescriptor
, Index
, 0, -1, -1, -1);
730 DPRINT1("Index %lu Descriptor %p\n", Index
, InterfaceDescriptor
);
731 ASSERT(InterfaceDescriptor
);
733 if (InterfaceDescriptor
->bInterfaceClass
!= 0x1)
736 // collection contains non audio class
738 return STATUS_UNSUCCESSFUL
;
741 if (FirstDescriptor
== NULL
)
744 // store interface descriptor
746 FirstDescriptor
= InterfaceDescriptor
;
750 if (FirstDescriptor
->bInterfaceSubClass
== InterfaceDescriptor
->bInterfaceSubClass
)
753 // interface subclass must be different from the first interface
755 return STATUS_UNSUCCESSFUL
;
760 // this is an composite audio device
762 DPRINT("[USBCCGP] Audio Composite Device detected\n");
765 // audio interfaces are all grouped into one single function
767 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
));
768 if (!FDODeviceExtension
->FunctionDescriptor
)
773 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count\n");
774 return STATUS_INSUFFICIENT_RESOURCES
;
778 // init function number
780 FDODeviceExtension
->FunctionDescriptor
[0].FunctionNumber
= 0;
785 Status
= AllocateInterfaceDescriptorsArray(FDODeviceExtension
->ConfigurationDescriptor
, &FDODeviceExtension
->FunctionDescriptor
[0].InterfaceDescriptorList
);
786 if (!NT_SUCCESS(Status
))
789 // failed to allocate descriptor array
791 DPRINT1("[USBCCGP] Failed to allocate descriptor array %lx\n", Status
);
796 // now init the device ids
798 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, FirstDescriptor
, 0, &FDODeviceExtension
->FunctionDescriptor
[0]);
799 if (!NT_SUCCESS(Status
))
802 // failed to init ids
804 DPRINT1("[USBCCGP] Failed to init ids with %lx\n", Status
);
809 // number of interfaces
811 FDODeviceExtension
->FunctionDescriptor
[0].NumberOfInterfaces
= FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
;
814 // store function count
816 FDODeviceExtension
->FunctionDescriptorCount
= 1;
821 return STATUS_SUCCESS
;
825 USBCCGP_EnumerateFunctions(
826 IN PDEVICE_OBJECT DeviceObject
)
829 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
832 // get device extension
834 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
835 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
838 // first try with filter driver
840 Status
= USBCCGP_CustomEnumWithInterface(DeviceObject
);
841 if (NT_SUCCESS(Status
))
850 // enumerate functions with interface association descriptor
852 Status
= USBCCGP_EnumWithAssociationDescriptor(DeviceObject
);
853 if (NT_SUCCESS(Status
))
863 // try with union function descriptors
865 Status
= USBCCGP_EnumWithUnionFunctionDescriptors(DeviceObject
);
866 if (NT_SUCCESS(Status
))
876 // try with legacy audio methods
878 Status
= USBCCGP_EnumWithAudioLegacy(DeviceObject
);
879 if (NT_SUCCESS(Status
))
888 // try with legacy enumeration
890 return USBCCGP_LegacyEnum(DeviceObject
);