ReactOS 0.4.17-dev-116-ga4b6fe9
function.c
Go to the documentation of this file.
1/*
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.
6 * PROGRAMMERS:
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
9 * Cameron Gutman
10 */
11
12#include "usbccgp.h"
13
14#define NDEBUG
15#include <debug.h>
16
21{
24 PIRP Irp;
27
28 /* Sanity checks */
30
31 /* Initialize event */
33
34 /* Init interface */
37 BusInterface->Size = sizeof(USBC_DEVICE_CONFIGURATION_INTERFACE_V1);
38
39 /* Create irp */
42 NULL,
43 0,
44 NULL,
45 &Event,
46 &IoStatus);
47
48 //
49 // was irp built
50 //
51 if (Irp == NULL)
52 {
53 //
54 // no memory
55 //
57 }
58
59 //
60 // initialize request
61 //
63 Stack->MajorFunction = IRP_MJ_PNP;
64 Stack->MinorFunction = IRP_MN_QUERY_INTERFACE;
65 Stack->Parameters.QueryInterface.Size = sizeof(BUS_INTERFACE_STANDARD);
66 Stack->Parameters.QueryInterface.InterfaceType = (LPGUID)&USB_BUS_INTERFACE_USBC_CONFIGURATION_GUID;
67 Stack->Parameters.QueryInterface.Version = 2;
68 Stack->Parameters.QueryInterface.Interface = (PINTERFACE)&BusInterface;
69 Stack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
70 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
71
72 //
73 // call driver
74 //
76
77 //
78 // did operation complete
79 //
81 {
82 //
83 // wait for completion
84 //
86
87 //
88 // collect status
89 //
90 Status = IoStatus.Status;
91 }
92
93 return Status;
94}
95
99{
100 PFDO_DEVICE_EXTENSION FDODeviceExtension;
101 ULONG FunctionDescriptorBufferLength = 0;
103 PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptorBuffer = NULL;
104
105 //
106 // get device extension
107 //
108 FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
109 ASSERT(FDODeviceExtension->Common.IsFDO);
110
111 if (FDODeviceExtension->BusInterface.StartDeviceCallback == NULL)
112 {
113 //
114 // not supported
115 //
117 }
118
119 //
120 // invoke callback
121 //
122 Status = FDODeviceExtension->BusInterface.StartDeviceCallback(FDODeviceExtension->DeviceDescriptor,
123 FDODeviceExtension->ConfigurationDescriptor,
124 &FunctionDescriptorBuffer,
125 &FunctionDescriptorBufferLength,
127 FDODeviceExtension->PhysicalDeviceObject);
128
129 DPRINT("USBCCGP_CustomEnumWithInterface Status %lx\n", Status);
130 if (!NT_SUCCESS(Status))
131 {
132 //
133 // failed
134 //
135 return Status;
136 }
137
138 DPRINT("FunctionDescriptorBufferLength %lu\n", FunctionDescriptorBufferLength);
139 DPRINT("FunctionDescriptorBuffer %p\n", FunctionDescriptorBuffer);
140
141 //
142 // assume length % function buffer size
143 //
144 ASSERT(FunctionDescriptorBufferLength);
145 ASSERT(FunctionDescriptorBufferLength % sizeof(USBC_FUNCTION_DESCRIPTOR) == 0);
146
147 //
148 // store result
149 //
150 FDODeviceExtension->FunctionDescriptor = FunctionDescriptorBuffer;
151 FDODeviceExtension->FunctionDescriptorCount = FunctionDescriptorBufferLength / sizeof(USBC_FUNCTION_DESCRIPTOR);
152
153 //
154 // success
155 //
156 return STATUS_SUCCESS;
157}
158
159ULONG
161 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor)
162{
164 PUCHAR Offset, End;
165 ULONG Count = 0;
166
167 //
168 // init offsets
169 //
170 Offset = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->bLength;
171 End = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength;
172
173 while (Offset < End)
174 {
175 //
176 // get association descriptor
177 //
179
181 {
182 //
183 // found descriptor
184 //
185 Count++;
186 }
187
188 //
189 // move to next descriptor
190 //
191 Offset += Descriptor->bLength;
192 }
193
194 //
195 // done
196 //
197 return Count;
198}
199
202 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
203 IN ULONG Index)
204{
206 PUCHAR Offset, End;
207 ULONG Count = 0;
208
209 //
210 // init offsets
211 //
212 Offset = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->bLength;
213 End = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength;
214
215 while (Offset < End)
216 {
217 //
218 // get association descriptor
219 //
221
223 {
224 if (Index == Count)
225 {
226 //
227 // found descriptor
228 //
229 return Descriptor;
230 }
231
232 //
233 // not the searched one
234 //
235 Count++;
236 }
237
238 //
239 // move to next descriptor
240 //
241 Offset += Descriptor->bLength;
242 }
243
244 //
245 // failed to find descriptor at the specified index
246 //
247 return NULL;
248}
249
252 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
253 IN PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR AssociationDescriptor,
254 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor)
255{
257 PUCHAR Offset, End;
258 ULONG Count = 0;
259
260 //
261 // init offsets
262 //
263 Offset = (PUCHAR)AssociationDescriptor + AssociationDescriptor->bLength;
264 End = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength;
265
266 while (Offset < End)
267 {
268 //
269 // get association descriptor
270 //
272
273 if (Descriptor->bLength == sizeof(USB_INTERFACE_DESCRIPTOR) && Descriptor->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE)
274 {
275 //
276 // store interface descriptor
277 //
278 FunctionDescriptor->InterfaceDescriptorList[Count] = Descriptor;
279 Count++;
280
281 if (Count == AssociationDescriptor->bInterfaceCount)
282 {
283 //
284 // got all interfaces
285 //
286 return STATUS_SUCCESS;
287 }
288 }
289
291 {
292 //
293 // WTF? a association descriptor which overlaps the next association descriptor
294 //
295 DPRINT1("Invalid association descriptor\n");
296 ASSERT(FALSE);
297 return STATUS_UNSUCCESSFUL;
298 }
299
300 //
301 // move to next descriptor
302 //
303 Offset += Descriptor->bLength;
304 }
305
306 //
307 // invalid association descriptor
308 //
309 DPRINT1("Invalid association descriptor\n");
310 return STATUS_UNSUCCESSFUL;
311}
312
315 IN PFDO_DEVICE_EXTENSION FDODeviceExtension,
316 IN ULONG FunctionNumber,
317 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor)
318{
321 LPWSTR DescriptionBuffer;
322 WCHAR Buffer[100];
323 ULONG Index;
324
325 // init function number
326 FunctionDescriptor->FunctionNumber = (UCHAR)FunctionNumber;
327
328 // get association descriptor
329 Descriptor = USBCCGP_GetAssociationDescriptorAtIndex(FDODeviceExtension->ConfigurationDescriptor, FunctionNumber);
331
332 // store number interfaces
333 FunctionDescriptor->NumberOfInterfaces = Descriptor->bInterfaceCount;
334
335 // allocate array for interface count
336 FunctionDescriptor->InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR) * Descriptor->bInterfaceCount);
337 if (!FunctionDescriptor->InterfaceDescriptorList)
338 {
339 //
340 // no memory
341 //
343 }
344
345 // init interface list
346 Status = USBCCGP_InitInterfaceListOfFunctionDescriptor(FDODeviceExtension->ConfigurationDescriptor, Descriptor, FunctionDescriptor);
347 if (!NT_SUCCESS(Status))
348 {
349 //
350 // failed
351 //
352 return Status;
353 }
354
355 //
356 // now init interface description
357 //
358 if (Descriptor->iFunction)
359 {
360 //
361 // get interface description
362 //
363 Status = USBCCGP_GetStringDescriptor(FDODeviceExtension->NextDeviceObject,
364 100 * sizeof(WCHAR),
365 Descriptor->iFunction,
366 0x0409, //FIXME
367 (PVOID*)&DescriptionBuffer);
368 if (!NT_SUCCESS(Status))
369 {
370 //
371 // no description
372 //
373 RtlInitUnicodeString(&FunctionDescriptor->FunctionDescription, L"");
374 }
375 else
376 {
377 //
378 // init description
379 //
380 RtlInitUnicodeString(&FunctionDescriptor->FunctionDescription, DescriptionBuffer);
381 }
382 DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor->FunctionDescription);
383 }
384
385 //
386 // now init hardware id
387 //
389 L"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x",
390 FDODeviceExtension->DeviceDescriptor->idVendor,
391 FDODeviceExtension->DeviceDescriptor->idProduct,
392 FDODeviceExtension->DeviceDescriptor->bcdDevice,
393 Descriptor->bFirstInterface) + 1;
395 L"USB\\VID_%04x&PID_%04x&MI_%02x",
396 FDODeviceExtension->DeviceDescriptor->idVendor,
397 FDODeviceExtension->DeviceDescriptor->idProduct,
398 Descriptor->bFirstInterface) + 1;
399
400 // allocate result buffer
401 DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR));
402 if (!DescriptionBuffer)
403 {
404 //
405 // failed to allocate memory
406 //
408 }
409
410 // copy description
411 RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR));
412 FunctionDescriptor->HardwareId.Buffer = DescriptionBuffer;
413 FunctionDescriptor->HardwareId.Length = Index * sizeof(WCHAR);
414 FunctionDescriptor->HardwareId.MaximumLength = (Index + 1) * sizeof(WCHAR);
415
416 //
417 // now init the compatible id
418 //
420 L"USB\\Class_%02x&SubClass_%02x&Prot_%02x",
421 Descriptor->bFunctionClass,
422 Descriptor->bFunctionSubClass,
423 Descriptor->bFunctionProtocol) + 1;
425 L"USB\\Class_%02x&SubClass_%02x",
426 Descriptor->bFunctionClass,
427 Descriptor->bFunctionSubClass) + 1;
429 L"USB\\Class_%02x",
430 Descriptor->bFunctionClass) + 1;
431
432 // allocate result buffer
433 DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR));
434 if (!DescriptionBuffer)
435 {
436 //
437 // failed to allocate memory
438 //
440 }
441
442 // copy description
443 RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR));
444 FunctionDescriptor->CompatibleId.Buffer = DescriptionBuffer;
445 FunctionDescriptor->CompatibleId.Length = Index * sizeof(WCHAR);
446 FunctionDescriptor->CompatibleId.MaximumLength = (Index + 1) * sizeof(WCHAR);
447
448 //
449 // done
450 //
451 return STATUS_SUCCESS;
452}
453
457{
458 ULONG DescriptorCount, Index;
459 PFDO_DEVICE_EXTENSION FDODeviceExtension;
461
462 //
463 // get device extension
464 //
465 FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
466 ASSERT(FDODeviceExtension->Common.IsFDO);
467
468 //
469 // count association descriptors
470 //
471 DescriptorCount = USBCCGP_CountAssociationDescriptors(FDODeviceExtension->ConfigurationDescriptor);
472 if (!DescriptorCount)
473 {
474 //
475 // no descriptors found
476 //
478 }
479
480 //
481 // allocate function descriptor array
482 //
483 FDODeviceExtension->FunctionDescriptor = AllocateItem(NonPagedPool, sizeof(USBC_FUNCTION_DESCRIPTOR) * DescriptorCount);
484 if (!FDODeviceExtension->FunctionDescriptor)
485 {
486 //
487 // no memory
488 //
489 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count %x\n", DescriptorCount);
491 }
492
493 for (Index = 0; Index < DescriptorCount; Index++)
494 {
495 //
496 // init function descriptors
497 //
498 Status = USBCCGP_InitFunctionDescriptor(FDODeviceExtension, Index, &FDODeviceExtension->FunctionDescriptor[Index]);
499 if (!NT_SUCCESS(Status))
500 {
501 //
502 // failed
503 //
504 return Status;
505 }
506 }
507
508 //
509 // store function descriptor count
510 //
511 FDODeviceExtension->FunctionDescriptorCount = DescriptorCount;
512
513 //
514 // done
515 //
516 return Status;
517}
518
521 IN PFDO_DEVICE_EXTENSION FDODeviceExtension,
523 IN ULONG FunctionIndex,
524 OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor)
525{
526 ULONG Index;
527 WCHAR Buffer[200];
528 LPWSTR DescriptionBuffer;
530
531 //
532 // now init interface description
533 //
534 if (Descriptor->iInterface)
535 {
536 //
537 // get interface description
538 //
539 Status = USBCCGP_GetStringDescriptor(FDODeviceExtension->NextDeviceObject,
540 100 * sizeof(WCHAR),
541 Descriptor->iInterface,
542 0x0409, //FIXME
543 (PVOID*)&DescriptionBuffer);
544 if (!NT_SUCCESS(Status))
545 {
546 //
547 // no description
548 //
549 RtlInitUnicodeString(&FunctionDescriptor->FunctionDescription, L"");
550 }
551 else
552 {
553 //
554 // init description
555 //
556 RtlInitUnicodeString(&FunctionDescriptor->FunctionDescription, DescriptionBuffer);
557 }
558 DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor->FunctionDescription);
559 }
560
561
562 //
563 // now init hardware id
564 //
566 L"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x",
567 FDODeviceExtension->DeviceDescriptor->idVendor,
568 FDODeviceExtension->DeviceDescriptor->idProduct,
569 FDODeviceExtension->DeviceDescriptor->bcdDevice,
570 FunctionIndex) + 1;
572 L"USB\\VID_%04x&PID_%04x&MI_%02x",
573 FDODeviceExtension->DeviceDescriptor->idVendor,
574 FDODeviceExtension->DeviceDescriptor->idProduct,
575 FunctionIndex) + 1;
576
577 // allocate result buffer
578 DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR));
579 if (!DescriptionBuffer)
580 {
581 //
582 // failed to allocate memory
583 //
585 }
586
587 // copy description
588 RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR));
589 FunctionDescriptor->HardwareId.Buffer = DescriptionBuffer;
590 FunctionDescriptor->HardwareId.Length = Index * sizeof(WCHAR);
591 FunctionDescriptor->HardwareId.MaximumLength = (Index + 1) * sizeof(WCHAR);
592
593 //
594 // now init the compatible id
595 //
597 L"USB\\Class_%02x&SubClass_%02x&Prot_%02x",
598 Descriptor->bInterfaceClass,
599 Descriptor->bInterfaceSubClass,
600 Descriptor->bInterfaceProtocol) + 1;
602 L"USB\\Class_%02x&SubClass_%02x",
603 Descriptor->bInterfaceClass,
604 Descriptor->bInterfaceSubClass) + 1;
606 L"USB\\Class_%02x",
607 Descriptor->bInterfaceClass) + 1;
608
609 // allocate result buffer
610 DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR));
611 if (!DescriptionBuffer)
612 {
613 //
614 // failed to allocate memory
615 //
617 }
618
619 // copy description
620 RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR));
621 FunctionDescriptor->CompatibleId.Buffer = DescriptionBuffer;
622 FunctionDescriptor->CompatibleId.Length = Index * sizeof(WCHAR);
623 FunctionDescriptor->CompatibleId.MaximumLength = (Index + 1) * sizeof(WCHAR);
624
625 //
626 // done
627 //
628 return STATUS_SUCCESS;
629}
630
631
635{
636 ULONG Index, SubIndex;
637 PFDO_DEVICE_EXTENSION FDODeviceExtension;
639 PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, NextInterfaceDescriptor;
640
641 //
642 // get device extension
643 //
644 FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
645 ASSERT(FDODeviceExtension->Common.IsFDO);
646
647 //
648 // sanity check
649 //
650 ASSERT(FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces);
651
652 //
653 // allocate function array
654 //
655 FDODeviceExtension->FunctionDescriptor = AllocateItem(NonPagedPool, sizeof(USBC_FUNCTION_DESCRIPTOR) * FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces);
656 if (!FDODeviceExtension->FunctionDescriptor)
657 {
658 //
659 // no memory
660 //
661 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor %lu\n", FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces);
663 }
664
665 //
666 // init function descriptors
667 //
668 FDODeviceExtension->FunctionDescriptorCount = FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces;
669 for (Index = 0; Index < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; Index++)
670 {
671 // get interface descriptor
672 InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index, 0, -1, -1, -1);
674 {
675 //
676 // failed to find interface descriptor
677 //
678 DPRINT1("[USBCCGP] Failed to find interface descriptor index %lu\n", Index);
679 ASSERT(FALSE);
680 return STATUS_UNSUCCESSFUL;
681 }
682
683 SubIndex = 0;
684 if (InterfaceDescriptor->bInterfaceClass == USB_DEVICE_CLASS_AUDIO)
685 {
686 // AUDIO CLASS lets group all audio interfaces together
687 //
688 // init function descriptor
689 //
690 FDODeviceExtension->FunctionDescriptor[Index].FunctionNumber = Index;
691 FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces = 1;
692 FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR) * FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces);
693 if (!FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList)
694 {
695 //
696 // no memory
697 //
698 FreeItem(FDODeviceExtension->FunctionDescriptor);
699 FDODeviceExtension->FunctionDescriptor = NULL;
700 FDODeviceExtension->FunctionDescriptorCount = 0;
702 }
703
704 //
705 // store interface descriptor
706 //
707 FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[SubIndex] = InterfaceDescriptor;
708 while (TRUE)
709 {
710 NextInterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index + SubIndex + 1, 0, -1, -1, -1);
711 if (!NextInterfaceDescriptor || NextInterfaceDescriptor->bInterfaceClass != USB_DEVICE_CLASS_AUDIO)
712 {
713 // end of collection
714 break;
715 }
716 SubIndex++;
717 ASSERT(SubIndex < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces);
718 FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces++;
719 FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[SubIndex] = NextInterfaceDescriptor;
720 }
721 }
722 else
723 {
724 //
725 // init function descriptor
726 //
727 FDODeviceExtension->FunctionDescriptor[Index].FunctionNumber = Index;
728 FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces = 1;
729 FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR));
730 if (!FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList)
731 {
732 //
733 // no memory
734 //
736 }
737
738 //
739 // store interface descriptor
740 //
741 FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[0] = InterfaceDescriptor;
742 }
743
744 //
745 // now init the device ids
746 //
747 Status = USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension, InterfaceDescriptor, Index, &FDODeviceExtension->FunctionDescriptor[Index]);
748 if (!NT_SUCCESS(Status))
749 {
750 //
751 // failed to init ids
752 //
753 DPRINT1("[USBCCGP] Failed to init ids with %lx\n", Status);
754 return Status;
755 }
756 //
757 // increment interface count
758 //
759 Index += SubIndex;
760 }
761
762 //
763 // done
764 //
765 return Status;
766}
767
771{
774}
775
779{
780 ULONG Index;
782 PFDO_DEVICE_EXTENSION FDODeviceExtension;
784
785 //
786 // get device extension
787 //
788 FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
789 ASSERT(FDODeviceExtension->Common.IsFDO);
790
791
792 //
793 // first check if all interfaces belong to the same audio class
794 //
795 for (Index = 0; Index < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; Index++)
796 {
797 //
798 // get interface descriptor
799 //
800 InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index, 0, -1, -1, -1);
801 DPRINT1("Index %lu Descriptor %p\n", Index, InterfaceDescriptor);
803
804 if (InterfaceDescriptor->bInterfaceClass != USB_DEVICE_CLASS_AUDIO)
805 {
806 //
807 // collection contains non audio class
808 //
809 return STATUS_UNSUCCESSFUL;
810 }
811
812 if (FirstDescriptor == NULL)
813 {
814 //
815 // store interface descriptor
816 //
817 FirstDescriptor = InterfaceDescriptor;
818 continue;
819 }
820
821 if (FirstDescriptor->bInterfaceSubClass == InterfaceDescriptor->bInterfaceSubClass)
822 {
823 //
824 // interface subclass must be different from the first interface
825 //
826 return STATUS_UNSUCCESSFUL;
827 }
828 }
829
830 //
831 // this is an composite audio device
832 //
833 DPRINT("[USBCCGP] Audio Composite Device detected\n");
834
835 //
836 // audio interfaces are all grouped into one single function
837 //
838 FDODeviceExtension->FunctionDescriptor = AllocateItem(NonPagedPool, sizeof(USBC_FUNCTION_DESCRIPTOR));
839 if (!FDODeviceExtension->FunctionDescriptor)
840 {
841 //
842 // no memory
843 //
844 DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count\n");
846 }
847
848 //
849 // init function number
850 //
851 FDODeviceExtension->FunctionDescriptor[0].FunctionNumber = 0;
852
853 //
854 // store interfaces
855 //
856 Status = AllocateInterfaceDescriptorsArray(FDODeviceExtension->ConfigurationDescriptor, &FDODeviceExtension->FunctionDescriptor[0].InterfaceDescriptorList);
857 if (!NT_SUCCESS(Status))
858 {
859 //
860 // failed to allocate descriptor array
861 //
862 DPRINT1("[USBCCGP] Failed to allocate descriptor array %lx\n", Status);
863 return Status;
864 }
865
866 //
867 // now init the device ids
868 //
869 Status = USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension, FirstDescriptor, 0, &FDODeviceExtension->FunctionDescriptor[0]);
870 if (!NT_SUCCESS(Status))
871 {
872 //
873 // failed to init ids
874 //
875 DPRINT1("[USBCCGP] Failed to init ids with %lx\n", Status);
876 return Status;
877 }
878
879 //
880 // number of interfaces
881 //
882 FDODeviceExtension->FunctionDescriptor[0].NumberOfInterfaces = FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces;
883
884 //
885 // store function count
886 //
887 FDODeviceExtension->FunctionDescriptorCount = 1;
888
889 //
890 // done
891 //
892 return STATUS_SUCCESS;
893}
894
898{
900 PFDO_DEVICE_EXTENSION FDODeviceExtension;
901
902 //
903 // get device extension
904 //
905 FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
906 ASSERT(FDODeviceExtension->Common.IsFDO);
907
908 //
909 // first try with filter driver
910 //
912 if (NT_SUCCESS(Status))
913 {
914 //
915 // succeeded
916 //
917 return Status;
918 }
919
920 //
921 // enumerate functions with interface association descriptor
922 //
924 if (NT_SUCCESS(Status))
925 {
926 //
927 // succeeded
928 //
929 return Status;
930 }
931
932#if 0
933 //
934 // try with union function descriptors
935 //
937 if (NT_SUCCESS(Status))
938 {
939 //
940 // succeeded
941 //
942 return Status;
943 }
944#endif
945
946 //
947 // try with legacy audio methods
948 //
950 if (NT_SUCCESS(Status))
951 {
952 //
953 // succeeded
954 //
955 return Status;
956 }
957
958 //
959 // try with legacy enumeration
960 //
962}
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
struct _FDO_DEVICE_EXTENSION * PFDO_DEVICE_EXTENSION
NTSTATUS USBCCGP_EnumerateFunctions(IN PDEVICE_OBJECT DeviceObject)
Definition: function.c:896
NTSTATUS USBCCGP_EnumWithAudioLegacy(IN PDEVICE_OBJECT DeviceObject)
Definition: function.c:777
NTSTATUS USBCCGP_EnumWithAssociationDescriptor(IN PDEVICE_OBJECT DeviceObject)
Definition: function.c:455
NTSTATUS USBCCG_InitIdsWithInterfaceDescriptor(IN PFDO_DEVICE_EXTENSION FDODeviceExtension, IN PUSB_INTERFACE_DESCRIPTOR Descriptor, IN ULONG FunctionIndex, OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor)
Definition: function.c:520
NTSTATUS USBCCGP_InitInterfaceListOfFunctionDescriptor(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR AssociationDescriptor, OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor)
Definition: function.c:251
NTSTATUS USBCCGP_EnumWithUnionFunctionDescriptors(IN PDEVICE_OBJECT DeviceObject)
Definition: function.c:769
NTSTATUS USBCCGP_CustomEnumWithInterface(IN PDEVICE_OBJECT DeviceObject)
Definition: function.c:97
NTSTATUS USBCCGP_QueryInterface(IN PDEVICE_OBJECT DeviceObject, OUT PUSBC_DEVICE_CONFIGURATION_INTERFACE_V1 BusInterface)
Definition: function.c:18
ULONG USBCCGP_CountAssociationDescriptors(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor)
Definition: function.c:160
PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR USBCCGP_GetAssociationDescriptorAtIndex(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN ULONG Index)
Definition: function.c:201
NTSTATUS USBCCGP_InitFunctionDescriptor(IN PFDO_DEVICE_EXTENSION FDODeviceExtension, IN ULONG FunctionNumber, OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor)
Definition: function.c:314
NTSTATUS USBCCGP_LegacyEnum(IN PDEVICE_OBJECT DeviceObject)
Definition: function.c:633
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define NonPagedPool
Definition: env_spec_w32.h:307
Status
Definition: gdiplustypes.h:25
PVOID AllocateItem(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes)
Definition: misc.c:29
VOID FreeItem(IN PVOID Item)
Definition: misc.c:37
#define ASSERT(a)
Definition: mode.c:44
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
#define KernelMode
Definition: asm.h:38
int Count
Definition: noreturn.cpp:7
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
@ NotificationEvent
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
Definition: irp.c:1069
#define IoCallDriver
Definition: irp.c:1225
short WCHAR
Definition: pedump.c:58
GUID * LPGUID
Definition: guiddef.h:81
struct _INTERFACE * PINTERFACE
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
COMMON_DEVICE_EXTENSION Common
Definition: pci.h:84
BUS_INTERFACE_STANDARD BusInterface
Definition: precomp.h:105
#define STATUS_PENDING
Definition: telnetd.h:14
unsigned char UCHAR
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
struct _USB_INTERFACE_DESCRIPTOR * PUSB_INTERFACE_DESCRIPTOR
#define USB_INTERFACE_DESCRIPTOR_TYPE
Definition: usb100.h:52
#define USB_DEVICE_CLASS_AUDIO
Definition: usb100.h:91
#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE
Definition: usb200.h:117
struct _USB_INTERFACE_ASSOCIATION_DESCRIPTOR * PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR
struct _USBC_DEVICE_CONFIGURATION_INTERFACE_V1 USBC_DEVICE_CONFIGURATION_INTERFACE_V1
struct _USBC_FUNCTION_DESCRIPTOR USBC_FUNCTION_DESCRIPTOR
#define USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1
Definition: usbbusif.h:199
NTSTATUS NTAPI USBCCGP_GetStringDescriptor(IN PDEVICE_OBJECT DeviceObject, IN ULONG DescriptorLength, IN UCHAR DescriptorIndex, IN LANGID LanguageId, OUT PVOID *OutDescriptor)
Definition: descriptor.c:102
NTSTATUS AllocateInterfaceDescriptorsArray(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, OUT PUSB_INTERFACE_DESCRIPTOR **OutArray)
Definition: descriptor.c:227
PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptorEx(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, PVOID StartPosition, LONG InterfaceNumber, LONG AlternateSetting, LONG InterfaceClass, LONG InterfaceSubClass, LONG InterfaceProtocol)
Definition: usbd.c:496
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342
_In_ WDFUSBINTERFACE _In_ UCHAR _Out_ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
Definition: wdfusb.h:2334
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2695
#define IRP_MN_QUERY_INTERFACE
struct _BUS_INTERFACE_STANDARD BUS_INTERFACE_STANDARD
@ Executive
Definition: ketypes.h:467