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 DPRINT1("USBCCGP_CustomEnumWithInterface Status %x\n", Status
);
135 if (!NT_SUCCESS(Status
))
143 DPRINT1("FunctionDescriptorBufferLength %lu\n", FunctionDescriptorBufferLength
);
144 DPRINT1("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_ParseConfigurationDescriptor(FDODeviceExtension
->ConfigurationDescriptor
, Index
, 0);
654 if (InterfaceDescriptor
== NULL
)
657 // failed to find interface descriptor
659 DPRINT1("[USBCCGP] Failed to find interface descriptor index %lu\n", Index
);
660 return STATUS_UNSUCCESSFUL
;
664 // init function descriptor
666 FDODeviceExtension
->FunctionDescriptor
[Index
].FunctionNumber
= Index
;
667 FDODeviceExtension
->FunctionDescriptor
[Index
].NumberOfInterfaces
= 1;
668 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
= AllocateItem(NonPagedPool
, sizeof(PUSB_INTERFACE_DESCRIPTOR
) * 1);
669 if (!FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
)
674 return STATUS_INSUFFICIENT_RESOURCES
;
678 // store interface descriptor
680 FDODeviceExtension
->FunctionDescriptor
[Index
].InterfaceDescriptorList
[0] = InterfaceDescriptor
;
683 // now init the device ids
685 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, InterfaceDescriptor
, Index
, &FDODeviceExtension
->FunctionDescriptor
[Index
]);
686 if (!NT_SUCCESS(Status
))
689 // failed to init ids
691 DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status
);
696 // store function count
698 FDODeviceExtension
->FunctionDescriptorCount
++;
708 USBCCGP_EnumWithUnionFunctionDescriptors(
709 IN PDEVICE_OBJECT DeviceObject
)
712 return STATUS_NOT_IMPLEMENTED
;
716 USBCCGP_EnumWithAudioLegacy(
717 IN PDEVICE_OBJECT DeviceObject
)
720 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
, FirstDescriptor
= NULL
;
721 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
722 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 for(Index
= 0; Index
< FDODeviceExtension
->ConfigurationDescriptor
->bNumInterfaces
; Index
++)
737 // get interface descriptor
739 InterfaceDescriptor
= USBD_ParseConfigurationDescriptorEx(FDODeviceExtension
->ConfigurationDescriptor
, FDODeviceExtension
->ConfigurationDescriptor
, Index
, -1, -1, -1, -1);
740 if (InterfaceDescriptor
->bInterfaceClass
!= 0x1)
743 // collection contains non audio class
745 return STATUS_UNSUCCESSFUL
;
748 if (FirstDescriptor
== NULL
)
751 // store interface descriptor
753 FirstDescriptor
= InterfaceDescriptor
;
757 if (FirstDescriptor
->bInterfaceSubClass
== InterfaceDescriptor
->bInterfaceSubClass
)
760 // interface subclass must be different from the first interface
762 return STATUS_UNSUCCESSFUL
;
767 // this is an composite audio device
769 DPRINT1("[USBCCGP] Audio Composite Device detected\n");
772 // audio interfaces are all grouped into one single function
774 FDODeviceExtension
->FunctionDescriptor
= AllocateItem(NonPagedPool
, sizeof(USBC_FUNCTION_DESCRIPTOR
));
775 if (!FDODeviceExtension
->FunctionDescriptor
)
780 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count\n");
781 return STATUS_INSUFFICIENT_RESOURCES
;
785 // init function number
787 FDODeviceExtension
->FunctionDescriptor
[0].FunctionNumber
= 0;
792 Status
= AllocateInterfaceDescriptorsArray(FDODeviceExtension
->ConfigurationDescriptor
, &FDODeviceExtension
->FunctionDescriptor
[0].InterfaceDescriptorList
);
793 if (!NT_SUCCESS(Status
))
796 // failed to allocate descriptor array
798 DPRINT1("[USBCCGP] Failed to allocate descriptor array %x\n", Status
);
803 // now init the device ids
805 Status
= USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension
, FirstDescriptor
, 0, &FDODeviceExtension
->FunctionDescriptor
[0]);
806 if (!NT_SUCCESS(Status
))
809 // failed to init ids
811 DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status
);
816 // number of interfaces
818 FDODeviceExtension
->FunctionDescriptor
[0].NumberOfInterfaces
= CountInterfaceDescriptors(FDODeviceExtension
->ConfigurationDescriptor
);
821 // store function count
823 FDODeviceExtension
->FunctionDescriptorCount
= 1;
828 return STATUS_SUCCESS
;
832 USBCCGP_EnumerateFunctions(
833 IN PDEVICE_OBJECT DeviceObject
)
836 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
839 // get device extension
841 FDODeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
842 ASSERT(FDODeviceExtension
->Common
.IsFDO
);
845 // first try with filter driver
847 Status
= USBCCGP_CustomEnumWithInterface(DeviceObject
);
848 if (NT_SUCCESS(Status
))
857 // enumerate functions with interface association descriptor
859 Status
= USBCCGP_EnumWithAssociationDescriptor(DeviceObject
);
860 if (NT_SUCCESS(Status
))
870 // try with union function descriptors
872 Status
= USBCCGP_EnumWithUnionFunctionDescriptors(DeviceObject
);
873 if (NT_SUCCESS(Status
))
883 // try with legacy audio methods
885 Status
= USBCCGP_EnumWithAudioLegacy(DeviceObject
);
886 if (NT_SUCCESS(Status
))
895 // try with legacy enumeration
897 return USBCCGP_LegacyEnum(DeviceObject
);