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_GetStringDescriptor(FDODeviceExtension
->NextDeviceObject
,
370 Descriptor
->iFunction
,
372 (PVOID
*)&DescriptionBuffer
);
373 if (!NT_SUCCESS(Status
))
378 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, L
"");
385 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, DescriptionBuffer
);
387 DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor
->FunctionDescription
);
391 // now init hardware id
393 Index
= swprintf(Buffer
, L
"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
394 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
395 FDODeviceExtension
->DeviceDescriptor
->bcdDevice
,
396 Descriptor
->bFirstInterface
) + 1;
397 Index
= swprintf(&Buffer
[Index
], L
"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
398 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
399 Descriptor
->bFirstInterface
) + 1;
401 // allocate result buffer
402 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
403 if (!DescriptionBuffer
)
406 // failed to allocate memory
408 return STATUS_INSUFFICIENT_RESOURCES
;
412 RtlCopyMemory(DescriptionBuffer
, Buffer
, Index
* sizeof(WCHAR
));
413 FunctionDescriptor
->HardwareId
.Buffer
= DescriptionBuffer
;
414 FunctionDescriptor
->HardwareId
.Length
= Index
* sizeof(WCHAR
);
415 FunctionDescriptor
->HardwareId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
419 // now init the compatible id
421 Index
= swprintf(Buffer
, L
"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor
->bFunctionClass
, Descriptor
->bFunctionSubClass
, Descriptor
->bFunctionProtocol
) + 1;
422 Index
= swprintf(&Buffer
[Index
], L
"USB\\Class_%04x&SubClass_%04x", Descriptor
->bFunctionClass
, Descriptor
->bFunctionSubClass
) + 1;
423 Index
= swprintf(&Buffer
[Index
], L
"USB\\Class_%04x", Descriptor
->bFunctionClass
) + 1;
425 // allocate result buffer
426 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
427 if (!DescriptionBuffer
)
430 // failed to allocate memory
432 return STATUS_INSUFFICIENT_RESOURCES
;
436 RtlCopyMemory(DescriptionBuffer
, Buffer
, Index
* sizeof(WCHAR
));
437 FunctionDescriptor
->CompatibleId
.Buffer
= DescriptionBuffer
;
438 FunctionDescriptor
->CompatibleId
.Length
= Index
* sizeof(WCHAR
);
439 FunctionDescriptor
->CompatibleId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
444 return STATUS_SUCCESS
;
448 USBCCGP_EnumWithAssociationDescriptor(
449 IN PDEVICE_OBJECT DeviceObject
)
451 ULONG DescriptorCount
, Index
;
452 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
453 NTSTATUS Status
= STATUS_SUCCESS
;
456 // get device extension
458 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
459 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
462 // count association descriptors
464 DescriptorCount
= USBCCGP_CountAssociationDescriptors(FDODeviceExtension
->ConfigurationDescriptor
);
465 if (!DescriptorCount
)
468 // no descriptors found
470 return STATUS_NOT_SUPPORTED
;
474 // allocate function descriptor array
476 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
) * DescriptorCount
);
477 if (!FDODeviceExtension
->FunctionDescriptorCount
)
482 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count %x\n", DescriptorCount
);
483 return STATUS_INSUFFICIENT_RESOURCES
;
486 for(Index
= 0; Index
< DescriptorCount
; Index
++)
489 // init function descriptors
491 Status
= USBCCGP_InitFunctionDescriptor(FDODeviceExtension
, Index
, &FDODeviceExtension
->FunctionDescriptor
[Index
]);
492 if (!NT_SUCCESS(Status
))
502 // store function descriptor count
504 FDODeviceExtension
->FunctionDescriptorCount
= DescriptorCount
;
513 USBCCG_InitIdsWithInterfaceDescriptor(
514 IN PFDO_DEVICE_EXTENSION FDODeviceExtension
,
515 IN PUSB_INTERFACE_DESCRIPTOR Descriptor
,
516 IN ULONG FunctionIndex
,
517 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor
)
521 LPWSTR DescriptionBuffer
;
525 // now init interface description
527 if (Descriptor
->iInterface
)
530 // get interface description
532 Status
= USBCCGP_GetStringDescriptor(FDODeviceExtension
->NextDeviceObject
,
534 Descriptor
->iInterface
,
536 (PVOID
*)&DescriptionBuffer
);
537 if (!NT_SUCCESS(Status
))
542 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, L
"");
549 RtlInitUnicodeString(&FunctionDescriptor
->FunctionDescription
, DescriptionBuffer
);
551 DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor
->FunctionDescription
);
556 // now init hardware id
558 Index
= swprintf(Buffer
, L
"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
559 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
560 FDODeviceExtension
->DeviceDescriptor
->bcdDevice
,
562 Index
+= swprintf(&Buffer
[Index
], L
"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension
->DeviceDescriptor
->idVendor
,
563 FDODeviceExtension
->DeviceDescriptor
->idProduct
,
566 // allocate result buffer
567 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
568 if (!DescriptionBuffer
)
571 // failed to allocate memory
573 return STATUS_INSUFFICIENT_RESOURCES
;
577 RtlCopyMemory(DescriptionBuffer
, Buffer
, Index
* sizeof(WCHAR
));
578 FunctionDescriptor
->HardwareId
.Buffer
= DescriptionBuffer
;
579 FunctionDescriptor
->HardwareId
.Length
= Index
* sizeof(WCHAR
);
580 FunctionDescriptor
->HardwareId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
583 // now init the compatible id
585 Index
= swprintf(Buffer
, L
"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor
->bInterfaceClass
, Descriptor
->bInterfaceSubClass
, Descriptor
->bInterfaceProtocol
) + 1;
586 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x&SubClass_%02x", Descriptor
->bInterfaceClass
, Descriptor
->bInterfaceSubClass
) + 1;
587 Index
+= swprintf(&Buffer
[Index
], L
"USB\\Class_%02x", Descriptor
->bInterfaceClass
) + 1;
589 // allocate result buffer
590 DescriptionBuffer
= AllocateItem(NonPagedPool
, (Index
+ 1) * sizeof(WCHAR
));
591 if (!DescriptionBuffer
)
594 // failed to allocate memory
596 return STATUS_INSUFFICIENT_RESOURCES
;
600 RtlCopyMemory(DescriptionBuffer
, Buffer
, Index
* sizeof(WCHAR
));
601 FunctionDescriptor
->CompatibleId
.Buffer
= DescriptionBuffer
;
602 FunctionDescriptor
->CompatibleId
.Length
= Index
* sizeof(WCHAR
);
603 FunctionDescriptor
->CompatibleId
.MaximumLength
= (Index
+ 1) * sizeof(WCHAR
);
608 return STATUS_SUCCESS
;
614 IN PDEVICE_OBJECT DeviceObject
)
617 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
618 NTSTATUS Status
= STATUS_SUCCESS
;
619 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
622 // get device extension
624 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
625 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
630 ASSERT(FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
633 // allocate function array
635 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
) * FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
636 if (!FDODeviceExtension
->FunctionDescriptor
)
641 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor %lu\n", FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
);
642 return STATUS_INSUFFICIENT_RESOURCES
;
646 // init function descriptors
648 for(Index
= 0; Index
< FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
; Index
++)
650 // get interface descriptor
651 InterfaceDescriptor
= USBD_ParseConfigurationDescriptorEx(FDODeviceExtension
->ConfigurationDescriptor
, FDODeviceExtension
->ConfigurationDescriptor
, Index
, 0, -1, -1, -1);
652 if (InterfaceDescriptor
== NULL
)
655 // failed to find interface descriptor
657 DPRINT1("[USBCCGP] Failed to find interface descriptor index %lu\n", Index
);
659 return STATUS_UNSUCCESSFUL
;
663 // init function descriptor
665 FDODeviceExtension
->FunctionDescriptor
[Index
].FunctionNumber
= Index
;
666 FDODeviceExtension
->FunctionDescriptor
[Index
].NumberOfInterfaces
= 1;
667 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
= AllocateItem(NonPagedPool
, sizeof(PUSB_INTERFACE_DESCRIPTOR
) * 1);
668 if (!FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
)
673 return STATUS_INSUFFICIENT_RESOURCES
;
677 // store interface descriptor
679 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
[0] = InterfaceDescriptor
;
682 // now init the device ids
684 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, InterfaceDescriptor
, Index
, &FDODeviceExtension
->FunctionDescriptor
[Index
]);
685 if (!NT_SUCCESS(Status
))
688 // failed to init ids
690 DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status
);
695 // store function count
697 FDODeviceExtension
->FunctionDescriptorCount
++;
707 USBCCGP_EnumWithUnionFunctionDescriptors(
708 IN PDEVICE_OBJECT DeviceObject
)
711 return STATUS_NOT_IMPLEMENTED
;
715 USBCCGP_EnumWithAudioLegacy(
716 IN PDEVICE_OBJECT DeviceObject
)
719 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
, FirstDescriptor
= NULL
;
720 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
721 NTSTATUS Status
= STATUS_SUCCESS
;
725 // get device extension
727 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
728 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
732 // first check if all interfaces belong to the same audio class
734 StartPosition
= FDODeviceExtension
->ConfigurationDescriptor
;
735 for(Index
= 0; Index
< CountInterfaceDescriptors(FDODeviceExtension
->ConfigurationDescriptor
); Index
++)
738 // get interface descriptor
740 InterfaceDescriptor
= USBD_ParseConfigurationDescriptorEx(FDODeviceExtension
->ConfigurationDescriptor
, StartPosition
, -1, -1, -1, -1, -1);
741 DPRINT1("Index %lu Descriptor %p\n", Index
, InterfaceDescriptor
);
742 ASSERT(InterfaceDescriptor
);
745 // move to next descriptor
747 StartPosition
= (PVOID
)((ULONG_PTR
)InterfaceDescriptor
+ InterfaceDescriptor
->bLength
);
749 if (InterfaceDescriptor
->bInterfaceClass
!= 0x1)
752 // collection contains non audio class
754 return STATUS_UNSUCCESSFUL
;
757 if (FirstDescriptor
== NULL
)
760 // store interface descriptor
762 FirstDescriptor
= InterfaceDescriptor
;
766 if (FirstDescriptor
->bInterfaceSubClass
== InterfaceDescriptor
->bInterfaceSubClass
)
769 // interface subclass must be different from the first interface
771 return STATUS_UNSUCCESSFUL
;
776 // this is an composite audio device
778 DPRINT("[USBCCGP] Audio Composite Device detected\n");
781 // audio interfaces are all grouped into one single function
783 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
));
784 if (!FDODeviceExtension
->FunctionDescriptor
)
789 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count\n");
790 return STATUS_INSUFFICIENT_RESOURCES
;
794 // init function number
796 FDODeviceExtension
->FunctionDescriptor
[0].FunctionNumber
= 0;
801 Status
= AllocateInterfaceDescriptorsArray(FDODeviceExtension
->ConfigurationDescriptor
, &FDODeviceExtension
->FunctionDescriptor
[0].InterfaceDescriptorList
);
802 if (!NT_SUCCESS(Status
))
805 // failed to allocate descriptor array
807 DPRINT1("[USBCCGP] Failed to allocate descriptor array %x\n", Status
);
812 // now init the device ids
814 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, FirstDescriptor
, 0, &FDODeviceExtension
->FunctionDescriptor
[0]);
815 if (!NT_SUCCESS(Status
))
818 // failed to init ids
820 DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status
);
825 // number of interfaces
827 FDODeviceExtension
->FunctionDescriptor
[0].NumberOfInterfaces
= CountInterfaceDescriptors(FDODeviceExtension
->ConfigurationDescriptor
);
830 // store function count
832 FDODeviceExtension
->FunctionDescriptorCount
= 1;
837 return STATUS_SUCCESS
;
841 USBCCGP_EnumerateFunctions(
842 IN PDEVICE_OBJECT DeviceObject
)
845 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
848 // get device extension
850 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
851 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
854 // first try with filter driver
856 Status
= USBCCGP_CustomEnumWithInterface(DeviceObject
);
857 if (NT_SUCCESS(Status
))
866 // enumerate functions with interface association descriptor
868 Status
= USBCCGP_EnumWithAssociationDescriptor(DeviceObject
);
869 if (NT_SUCCESS(Status
))
879 // try with union function descriptors
881 Status
= USBCCGP_EnumWithUnionFunctionDescriptors(DeviceObject
);
882 if (NT_SUCCESS(Status
))
892 // try with legacy audio methods
894 Status
= USBCCGP_EnumWithAudioLegacy(DeviceObject
);
895 if (NT_SUCCESS(Status
))
904 // try with legacy enumeration
906 return USBCCGP_LegacyEnum(DeviceObject
);