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
;
33 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
38 RtlZeroMemory(BusInterface
, sizeof(USBC_DEVICE_CONFIGURATION_INTERFACE_V1
));
39 BusInterface
->Version
= USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1
;
40 BusInterface
->Size
= sizeof(USBC_DEVICE_CONFIGURATION_INTERFACE_V1
);
45 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_PNP
,
61 return STATUS_INSUFFICIENT_RESOURCES
;
67 Stack
=IoGetNextIrpStackLocation(Irp
);
68 Stack
->MajorFunction
= IRP_MJ_PNP
;
69 Stack
->MinorFunction
= IRP_MN_QUERY_INTERFACE
;
70 Stack
->Parameters
.QueryInterface
.Size
= sizeof(BUS_INTERFACE_STANDARD
);
71 Stack
->Parameters
.QueryInterface
.InterfaceType
= (LPGUID
)&USB_BUS_INTERFACE_USBC_CONFIGURATION_GUID
;
72 Stack
->Parameters
.QueryInterface
.Version
= 2;
73 Stack
->Parameters
.QueryInterface
.Interface
= (PINTERFACE
)&BusInterface
;
74 Stack
->Parameters
.QueryInterface
.InterfaceSpecificData
= NULL
;
75 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
80 Status
= IoCallDriver(DeviceObject
, Irp
);
83 // did operation complete
85 if (Status
== STATUS_PENDING
)
88 // wait for completion
90 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
95 Status
= IoStatus
.Status
;
102 USBCCGP_CustomEnumWithInterface(
103 IN PDEVICE_OBJECT DeviceObject
)
105 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
106 ULONG FunctionDescriptorBufferLength
= 0;
108 PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptorBuffer
= NULL
;
111 // get device extension
113 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
114 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
116 if (FDODeviceExtension
->BusInterface
.StartDeviceCallback
== NULL
)
121 return STATUS_NOT_SUPPORTED
;
127 Status
= FDODeviceExtension
->BusInterface
.StartDeviceCallback(FDODeviceExtension
->DeviceDescriptor
,
128 FDODeviceExtension
->ConfigurationDescriptor
,
129 &FunctionDescriptorBuffer
,
130 &FunctionDescriptorBufferLength
,
132 FDODeviceExtension
->PhysicalDeviceObject
);
134 DPRINT("USBCCGP_CustomEnumWithInterface Status %x\n", Status
);
135 if (!NT_SUCCESS(Status
))
143 DPRINT("FunctionDescriptorBufferLength %lu\n", FunctionDescriptorBufferLength
);
144 DPRINT("FunctionDescriptorBuffer %p\n", FunctionDescriptorBuffer
);
147 // assume length % function buffer size
149 ASSERT(FunctionDescriptorBufferLength
);
150 ASSERT(FunctionDescriptorBufferLength
% sizeof(USBC_FUNCTION_DESCRIPTOR
) == 0);
155 FDODeviceExtension
->FunctionDescriptor
= FunctionDescriptorBuffer
;
156 FDODeviceExtension
->FunctionDescriptorCount
= FunctionDescriptorBufferLength
/ sizeof(USBC_FUNCTION_DESCRIPTOR
);
161 return STATUS_SUCCESS
;
165 USBCCGP_CountAssociationDescriptors(
166 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
)
168 PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR Descriptor
;
175 Offset
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->bLength
;
176 End
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->wTotalLength
;
181 // get association descriptor
183 Descriptor
= (PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR
)Offset
;
185 if (Descriptor
->bLength
== sizeof(USB_INTERFACE_ASSOCIATION_DESCRIPTOR
) && Descriptor
->bDescriptorType
== USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE
)
194 // move to next descriptor
196 Offset
+= Descriptor
->bLength
;
205 PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR
206 USBCCGP_GetAssociationDescriptorAtIndex(
207 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
210 PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR Descriptor
;
217 Offset
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->bLength
;
218 End
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->wTotalLength
;
223 // get association descriptor
225 Descriptor
= (PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR
)Offset
;
227 if (Descriptor
->bLength
== sizeof(USB_INTERFACE_ASSOCIATION_DESCRIPTOR
) && Descriptor
->bDescriptorType
== USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE
)
238 // not the searched one
244 // move to next descriptor
246 Offset
+= Descriptor
->bLength
;
250 // failed to find descriptor at the specified index
256 USBCCGP_InitInterfaceListOfFunctionDescriptor(
257 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
258 IN PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR AssociationDescriptor
,
259 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor
)
261 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
268 Offset
= (PUCHAR
)AssociationDescriptor
+ AssociationDescriptor
->bLength
;
269 End
= (PUCHAR
)ConfigurationDescriptor
+ ConfigurationDescriptor
->wTotalLength
;
274 // get association descriptor
276 Descriptor
= (PUSB_INTERFACE_DESCRIPTOR
)Offset
;
278 if (Descriptor
->bLength
== sizeof(USB_INTERFACE_DESCRIPTOR
) && Descriptor
->bDescriptorType
== USB_INTERFACE_DESCRIPTOR_TYPE
)
281 // store interface descriptor
283 FunctionDescriptor
->InterfaceDescriptorList
[Count
] = Descriptor
;
286 if (Count
== AssociationDescriptor
->bInterfaceCount
)
289 // got all interfaces
291 return STATUS_SUCCESS
;
295 if (Descriptor
->bLength
== sizeof(USB_INTERFACE_ASSOCIATION_DESCRIPTOR
) && Descriptor
->bDescriptorType
== USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE
)
298 // WTF? a association descriptor which overlaps the next association descriptor
300 DPRINT1("Invalid association descriptor\n");
302 return STATUS_UNSUCCESSFUL
;
306 // move to next descriptor
308 Offset
+= Descriptor
->bLength
;
312 // invalid association descriptor
314 DPRINT1("Invalid association descriptor\n");
315 return STATUS_UNSUCCESSFUL
;
319 USBCCGP_InitFunctionDescriptor(
320 IN PFDO_DEVICE_EXTENSION FDODeviceExtension
,
321 IN ULONG FunctionNumber
,
322 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor
)
324 PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR Descriptor
;
326 LPWSTR DescriptionBuffer
;
330 // init function number
331 FunctionDescriptor
->FunctionNumber
= (UCHAR
)FunctionNumber
;
333 // get association descriptor
334 Descriptor
= USBCCGP_GetAssociationDescriptorAtIndex(FDODeviceExtension
->ConfigurationDescriptor
, FunctionNumber
);
337 // store number interfaces
338 FunctionDescriptor
->NumberOfInterfaces
= Descriptor
->bInterfaceCount
;
340 // allocate array for interface count
341 FunctionDescriptor
->InterfaceDescriptorList
= AllocateItem(NonPagedPool
, sizeof(PUSB_INTERFACE_DESCRIPTOR
) * Descriptor
->bInterfaceCount
);
342 if (FunctionDescriptor
->InterfaceDescriptorList
)
347 return STATUS_INSUFFICIENT_RESOURCES
;
350 // init interface list
351 Status
= USBCCGP_InitInterfaceListOfFunctionDescriptor(FDODeviceExtension
->ConfigurationDescriptor
, Descriptor
, FunctionDescriptor
);
352 if (!NT_SUCCESS(Status
))
361 // now init interface description
363 if (Descriptor
->iFunction
)
366 // get interface description
368 Status
= USBCCGP_GetDescriptor(FDODeviceExtension
->NextDeviceObject
,
369 USB_STRING_DESCRIPTOR_TYPE
,
371 Descriptor
->iFunction
,
373 (PVOID
*)&DescriptionBuffer
);
374 if (!NT_SUCCESS(Status
))
379 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, L
"");
386 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, DescriptionBuffer
);
388 DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor
->FunctionDescription
);
392 // now init hardware id
394 Index
= swprintf(Buffer
, L
"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
395 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
396 FDODeviceExtension
->DeviceDescriptor
->bcdDevice
,
397 Descriptor
->bFirstInterface
) + 1;
398 Index
= swprintf(&Buffer
[Index
], L
"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
399 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
400 Descriptor
->bFirstInterface
) + 1;
402 // allocate result buffer
403 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
404 if (!DescriptionBuffer
)
407 // failed to allocate memory
409 return STATUS_INSUFFICIENT_RESOURCES
;
413 RtlCopyMemory(DescriptionBuffer
, Buffer
, Index
* sizeof(WCHAR
));
414 FunctionDescriptor
->HardwareId
.Buffer
= DescriptionBuffer
;
415 FunctionDescriptor
->HardwareId
.Length
= Index
* sizeof(WCHAR
);
416 FunctionDescriptor
->HardwareId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
420 // now init the compatible id
422 Index
= swprintf(Buffer
, L
"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor
->bFunctionClass
, Descriptor
->bFunctionSubClass
, Descriptor
->bFunctionProtocol
) + 1;
423 Index
= swprintf(&Buffer
[Index
], L
"USB\\Class_%04x&SubClass_%04x", Descriptor
->bFunctionClass
, Descriptor
->bFunctionSubClass
) + 1;
424 Index
= swprintf(&Buffer
[Index
], L
"USB\\Class_%04x", Descriptor
->bFunctionClass
) + 1;
426 // allocate result buffer
427 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
428 if (!DescriptionBuffer
)
431 // failed to allocate memory
433 return STATUS_INSUFFICIENT_RESOURCES
;
437 RtlCopyMemory(DescriptionBuffer
, Buffer
, Index
* sizeof(WCHAR
));
438 FunctionDescriptor
->CompatibleId
.Buffer
= DescriptionBuffer
;
439 FunctionDescriptor
->CompatibleId
.Length
= Index
* sizeof(WCHAR
);
440 FunctionDescriptor
->CompatibleId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
445 return STATUS_SUCCESS
;
449 USBCCGP_EnumWithAssociationDescriptor(
450 IN PDEVICE_OBJECT DeviceObject
)
452 ULONG DescriptorCount
, Index
;
453 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
454 NTSTATUS Status
= STATUS_SUCCESS
;
457 // get device extension
459 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
460 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
463 // count association descriptors
465 DescriptorCount
= USBCCGP_CountAssociationDescriptors(FDODeviceExtension
->ConfigurationDescriptor
);
466 if (!DescriptorCount
)
469 // no descriptors found
471 return STATUS_NOT_SUPPORTED
;
475 // allocate function descriptor array
477 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
) * DescriptorCount
);
478 if (!FDODeviceExtension
->FunctionDescriptorCount
)
483 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count %x\n", DescriptorCount
);
484 return STATUS_INSUFFICIENT_RESOURCES
;
487 for(Index
= 0; Index
< DescriptorCount
; Index
++)
490 // init function descriptors
492 Status
= USBCCGP_InitFunctionDescriptor(FDODeviceExtension
, Index
, &FDODeviceExtension
->FunctionDescriptor
[Index
]);
493 if (!NT_SUCCESS(Status
))
503 // store function descriptor count
505 FDODeviceExtension
->FunctionDescriptorCount
= DescriptorCount
;
514 USBCCG_InitIdsWithInterfaceDescriptor(
515 IN PFDO_DEVICE_EXTENSION FDODeviceExtension
,
516 IN PUSB_INTERFACE_DESCRIPTOR Descriptor
,
517 IN ULONG FunctionIndex
,
518 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor
)
522 LPWSTR DescriptionBuffer
;
526 // now init interface description
528 if (Descriptor
->iInterface
)
531 // get interface description
533 Status
= USBCCGP_GetDescriptor(FDODeviceExtension
->NextDeviceObject
,
534 USB_STRING_DESCRIPTOR_TYPE
,
536 Descriptor
->iInterface
,
538 (PVOID
*)&DescriptionBuffer
);
539 if (!NT_SUCCESS(Status
))
544 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, L
"");
551 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, DescriptionBuffer
);
553 DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor
->FunctionDescription
);
558 // now init hardware id
560 Index
= swprintf(Buffer
, L
"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
561 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
562 FDODeviceExtension
->DeviceDescriptor
->bcdDevice
,
564 Index
+= swprintf(&Buffer
[Index
], L
"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
565 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
568 // allocate result buffer
569 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
570 if (!DescriptionBuffer
)
573 // failed to allocate memory
575 return STATUS_INSUFFICIENT_RESOURCES
;
579 RtlCopyMemory(DescriptionBuffer
, Buffer
, Index
* sizeof(WCHAR
));
580 FunctionDescriptor
->HardwareId
.Buffer
= DescriptionBuffer
;
581 FunctionDescriptor
->HardwareId
.Length
= Index
* sizeof(WCHAR
);
582 FunctionDescriptor
->HardwareId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
585 // now init the compatible id
587 Index
= swprintf(Buffer
, L
"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor
->bInterfaceClass
, Descriptor
->bInterfaceSubClass
, Descriptor
->bInterfaceProtocol
) + 1;
588 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x&SubClass_%02x", Descriptor
->bInterfaceClass
, Descriptor
->bInterfaceSubClass
) + 1;
589 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x", Descriptor
->bInterfaceClass
) + 1;
591 // allocate result buffer
592 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
593 if (!DescriptionBuffer
)
596 // failed to allocate memory
598 return STATUS_INSUFFICIENT_RESOURCES
;
602 RtlCopyMemory(DescriptionBuffer
, Buffer
, Index
* sizeof(WCHAR
));
603 FunctionDescriptor
->CompatibleId
.Buffer
= DescriptionBuffer
;
604 FunctionDescriptor
->CompatibleId
.Length
= Index
* sizeof(WCHAR
);
605 FunctionDescriptor
->CompatibleId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
610 return STATUS_SUCCESS
;
616 IN PDEVICE_OBJECT DeviceObject
)
619 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
620 NTSTATUS Status
= STATUS_SUCCESS
;
621 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
624 // get device extension
626 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
627 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
632 ASSERT(FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
635 // allocate function array
637 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
) * FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
638 if (!FDODeviceExtension
->FunctionDescriptor
)
643 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor %lu\n", FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
644 return STATUS_INSUFFICIENT_RESOURCES
;
648 // init function descriptors
650 for(Index
= 0; Index
< FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
; Index
++)
652 // get interface descriptor
653 InterfaceDescriptor
= USBD_ParseConfigurationDescriptorEx(FDODeviceExtension
->ConfigurationDescriptor
, FDODeviceExtension
->ConfigurationDescriptor
, Index
, 0, -1, -1, -1);
654 if (InterfaceDescriptor
== NULL
)
657 // failed to find interface descriptor
659 DPRINT1("[USBCCGP] Failed to find interface descriptor index %lu\n", Index
);
661 return STATUS_UNSUCCESSFUL
;
665 // init function descriptor
667 FDODeviceExtension
->FunctionDescriptor
[Index
].FunctionNumber
= Index
;
668 FDODeviceExtension
->FunctionDescriptor
[Index
].NumberOfInterfaces
= 1;
669 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
= AllocateItem(NonPagedPool
, sizeof(PUSB_INTERFACE_DESCRIPTOR
) * 1);
670 if (!FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
)
675 return STATUS_INSUFFICIENT_RESOURCES
;
679 // store interface descriptor
681 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
[0] = InterfaceDescriptor
;
684 // now init the device ids
686 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, InterfaceDescriptor
, Index
, &FDODeviceExtension
->FunctionDescriptor
[Index
]);
687 if (!NT_SUCCESS(Status
))
690 // failed to init ids
692 DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status
);
697 // store function count
699 FDODeviceExtension
->FunctionDescriptorCount
++;
709 USBCCGP_EnumWithUnionFunctionDescriptors(
710 IN PDEVICE_OBJECT DeviceObject
)
713 return STATUS_NOT_IMPLEMENTED
;
717 USBCCGP_EnumWithAudioLegacy(
718 IN PDEVICE_OBJECT DeviceObject
)
721 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
, FirstDescriptor
= NULL
;
722 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
723 NTSTATUS Status
= STATUS_SUCCESS
;
727 // get device extension
729 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
730 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
734 // first check if all interfaces belong to the same audio class
736 StartPosition
= FDODeviceExtension
->ConfigurationDescriptor
;
737 for(Index
= 0; Index
< CountInterfaceDescriptors(FDODeviceExtension
->ConfigurationDescriptor
); Index
++)
740 // get interface descriptor
742 InterfaceDescriptor
= USBD_ParseConfigurationDescriptorEx(FDODeviceExtension
->ConfigurationDescriptor
, StartPosition
, -1, -1, -1, -1, -1);
743 DPRINT1("Index %lu Descriptor %p\n", Index
, InterfaceDescriptor
);
744 ASSERT(InterfaceDescriptor
);
747 // move to next descriptor
749 StartPosition
= (PVOID
)((ULONG_PTR
)InterfaceDescriptor
+ InterfaceDescriptor
->bLength
);
751 if (InterfaceDescriptor
->bInterfaceClass
!= 0x1)
754 // collection contains non audio class
756 return STATUS_UNSUCCESSFUL
;
759 if (FirstDescriptor
== NULL
)
762 // store interface descriptor
764 FirstDescriptor
= InterfaceDescriptor
;
768 if (FirstDescriptor
->bInterfaceSubClass
== InterfaceDescriptor
->bInterfaceSubClass
)
771 // interface subclass must be different from the first interface
773 return STATUS_UNSUCCESSFUL
;
778 // this is an composite audio device
780 DPRINT("[USBCCGP] Audio Composite Device detected\n");
783 // audio interfaces are all grouped into one single function
785 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
));
786 if (!FDODeviceExtension
->FunctionDescriptor
)
791 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count\n");
792 return STATUS_INSUFFICIENT_RESOURCES
;
796 // init function number
798 FDODeviceExtension
->FunctionDescriptor
[0].FunctionNumber
= 0;
803 Status
= AllocateInterfaceDescriptorsArray(FDODeviceExtension
->ConfigurationDescriptor
, &FDODeviceExtension
->FunctionDescriptor
[0].InterfaceDescriptorList
);
804 if (!NT_SUCCESS(Status
))
807 // failed to allocate descriptor array
809 DPRINT1("[USBCCGP] Failed to allocate descriptor array %x\n", Status
);
814 // now init the device ids
816 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, FirstDescriptor
, 0, &FDODeviceExtension
->FunctionDescriptor
[0]);
817 if (!NT_SUCCESS(Status
))
820 // failed to init ids
822 DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status
);
827 // number of interfaces
829 FDODeviceExtension
->FunctionDescriptor
[0].NumberOfInterfaces
= CountInterfaceDescriptors(FDODeviceExtension
->ConfigurationDescriptor
);
832 // store function count
834 FDODeviceExtension
->FunctionDescriptorCount
= 1;
839 return STATUS_SUCCESS
;
843 USBCCGP_EnumerateFunctions(
844 IN PDEVICE_OBJECT DeviceObject
)
847 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
850 // get device extension
852 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
853 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
856 // first try with filter driver
858 Status
= USBCCGP_CustomEnumWithInterface(DeviceObject
);
859 if (NT_SUCCESS(Status
))
868 // enumerate functions with interface association descriptor
870 Status
= USBCCGP_EnumWithAssociationDescriptor(DeviceObject
);
871 if (NT_SUCCESS(Status
))
881 // try with union function descriptors
883 Status
= USBCCGP_EnumWithUnionFunctionDescriptors(DeviceObject
);
884 if (NT_SUCCESS(Status
))
894 // try with legacy audio methods
896 Status
= USBCCGP_EnumWithAudioLegacy(DeviceObject
);
897 if (NT_SUCCESS(Status
))
906 // try with legacy enumeration
908 return USBCCGP_LegacyEnum(DeviceObject
);