Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937/* * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface * LICENSE: GPL - See COPYING in the top level directory * FILE: drivers/usb/usbccgp/descriptor.c * PURPOSE: USB device driver. * PROGRAMMERS: * Michael Martin (michael.martin@reactos.org) * Johannes Anderwald (johannes.anderwald@reactos.org) * Cameron Gutman */
#include "usbccgp.h"
#define NDEBUG#include <debug.h>
NTSTATUSUSBCCGP_QueryInterface( IN PDEVICE_OBJECT DeviceObject, OUT PUSBC_DEVICE_CONFIGURATION_INTERFACE_V1 BusInterface){ KEVENT Event; NTSTATUS Status; PIRP Irp; IO_STATUS_BLOCK IoStatus; PIO_STACK_LOCATION Stack;
/* Sanity checks */ ASSERT(DeviceObject);
/* Initialize event */ KeInitializeEvent(&Event, NotificationEvent, FALSE);
/* Init interface */ RtlZeroMemory(BusInterface, sizeof(USBC_DEVICE_CONFIGURATION_INTERFACE_V1)); BusInterface->Version = USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1; BusInterface->Size = sizeof(USBC_DEVICE_CONFIGURATION_INTERFACE_V1);
/* Create irp */ Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP, DeviceObject, NULL, 0, NULL, &Event, &IoStatus);
// // was irp built // if (Irp == NULL) { // // no memory // return STATUS_INSUFFICIENT_RESOURCES; }
// // initialize request // Stack = IoGetNextIrpStackLocation(Irp); Stack->MajorFunction = IRP_MJ_PNP; Stack->MinorFunction = IRP_MN_QUERY_INTERFACE; Stack->Parameters.QueryInterface.Size = sizeof(BUS_INTERFACE_STANDARD); Stack->Parameters.QueryInterface.InterfaceType = (LPGUID)&USB_BUS_INTERFACE_USBC_CONFIGURATION_GUID; Stack->Parameters.QueryInterface.Version = 2; Stack->Parameters.QueryInterface.Interface = (PINTERFACE)&BusInterface; Stack->Parameters.QueryInterface.InterfaceSpecificData = NULL; Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
// // call driver // Status = IoCallDriver(DeviceObject, Irp);
// // did operation complete // if (Status == STATUS_PENDING) { // // wait for completion // KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
// // collect status // Status = IoStatus.Status; }
return Status;}
NTSTATUSUSBCCGP_CustomEnumWithInterface( IN PDEVICE_OBJECT DeviceObject){ PFDO_DEVICE_EXTENSION FDODeviceExtension; ULONG FunctionDescriptorBufferLength = 0; NTSTATUS Status; PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptorBuffer = NULL;
// // get device extension // FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; ASSERT(FDODeviceExtension->Common.IsFDO);
if (FDODeviceExtension->BusInterface.StartDeviceCallback == NULL) { // // not supported // return STATUS_NOT_SUPPORTED; }
// // invoke callback // Status = FDODeviceExtension->BusInterface.StartDeviceCallback(FDODeviceExtension->DeviceDescriptor, FDODeviceExtension->ConfigurationDescriptor, &FunctionDescriptorBuffer, &FunctionDescriptorBufferLength, DeviceObject, FDODeviceExtension->PhysicalDeviceObject);
DPRINT("USBCCGP_CustomEnumWithInterface Status %lx\n", Status); if (!NT_SUCCESS(Status)) { // // failed // return Status; }
DPRINT("FunctionDescriptorBufferLength %lu\n", FunctionDescriptorBufferLength); DPRINT("FunctionDescriptorBuffer %p\n", FunctionDescriptorBuffer);
// // assume length % function buffer size // ASSERT(FunctionDescriptorBufferLength); ASSERT(FunctionDescriptorBufferLength % sizeof(USBC_FUNCTION_DESCRIPTOR) == 0);
// // store result // FDODeviceExtension->FunctionDescriptor = FunctionDescriptorBuffer; FDODeviceExtension->FunctionDescriptorCount = FunctionDescriptorBufferLength / sizeof(USBC_FUNCTION_DESCRIPTOR);
// // success // return STATUS_SUCCESS;}
ULONGUSBCCGP_CountAssociationDescriptors( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor){ PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR Descriptor; PUCHAR Offset, End; ULONG Count = 0;
// // init offsets // Offset = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->bLength; End = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength;
while (Offset < End) { // // get association descriptor // Descriptor = (PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR)Offset;
if (Descriptor->bLength == sizeof(USB_INTERFACE_ASSOCIATION_DESCRIPTOR) && Descriptor->bDescriptorType == USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE) { // // found descriptor // Count++; }
// // move to next descriptor // Offset += Descriptor->bLength; }
// // done // return Count;}
PUSB_INTERFACE_ASSOCIATION_DESCRIPTORUSBCCGP_GetAssociationDescriptorAtIndex( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN ULONG Index){ PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR Descriptor; PUCHAR Offset, End; ULONG Count = 0;
// // init offsets // Offset = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->bLength; End = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength;
while (Offset < End) { // // get association descriptor // Descriptor = (PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR)Offset;
if (Descriptor->bLength == sizeof(USB_INTERFACE_ASSOCIATION_DESCRIPTOR) && Descriptor->bDescriptorType == USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE) { if (Index == Count) { // // found descriptor // return Descriptor; }
// // not the searched one // Count++; }
// // move to next descriptor // Offset += Descriptor->bLength; }
// // failed to find descriptor at the specified index // return NULL;}
NTSTATUSUSBCCGP_InitInterfaceListOfFunctionDescriptor( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR AssociationDescriptor, OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor){ PUSB_INTERFACE_DESCRIPTOR Descriptor; PUCHAR Offset, End; ULONG Count = 0;
// // init offsets // Offset = (PUCHAR)AssociationDescriptor + AssociationDescriptor->bLength; End = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength;
while (Offset < End) { // // get association descriptor // Descriptor = (PUSB_INTERFACE_DESCRIPTOR)Offset;
if (Descriptor->bLength == sizeof(USB_INTERFACE_DESCRIPTOR) && Descriptor->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE) { // // store interface descriptor // FunctionDescriptor->InterfaceDescriptorList[Count] = Descriptor; Count++;
if (Count == AssociationDescriptor->bInterfaceCount) { // // got all interfaces // return STATUS_SUCCESS; } }
if (Descriptor->bLength == sizeof(USB_INTERFACE_ASSOCIATION_DESCRIPTOR) && Descriptor->bDescriptorType == USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE) { // // WTF? a association descriptor which overlaps the next association descriptor // DPRINT1("Invalid association descriptor\n"); ASSERT(FALSE); return STATUS_UNSUCCESSFUL; }
// // move to next descriptor // Offset += Descriptor->bLength; }
// // invalid association descriptor // DPRINT1("Invalid association descriptor\n"); return STATUS_UNSUCCESSFUL;}
NTSTATUSUSBCCGP_InitFunctionDescriptor( IN PFDO_DEVICE_EXTENSION FDODeviceExtension, IN ULONG FunctionNumber, OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor){ PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR Descriptor; NTSTATUS Status; LPWSTR DescriptionBuffer; WCHAR Buffer[100]; ULONG Index;
// init function number FunctionDescriptor->FunctionNumber = (UCHAR)FunctionNumber;
// get association descriptor Descriptor = USBCCGP_GetAssociationDescriptorAtIndex(FDODeviceExtension->ConfigurationDescriptor, FunctionNumber); ASSERT(Descriptor);
// store number interfaces FunctionDescriptor->NumberOfInterfaces = Descriptor->bInterfaceCount;
// allocate array for interface count FunctionDescriptor->InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR) * Descriptor->bInterfaceCount); if (!FunctionDescriptor->InterfaceDescriptorList) { // // no memory // return STATUS_INSUFFICIENT_RESOURCES; }
// init interface list Status = USBCCGP_InitInterfaceListOfFunctionDescriptor(FDODeviceExtension->ConfigurationDescriptor, Descriptor, FunctionDescriptor); if (!NT_SUCCESS(Status)) { // // failed // return Status; }
// // now init interface description // if (Descriptor->iFunction) { // // get interface description // Status = USBCCGP_GetStringDescriptor(FDODeviceExtension->NextDeviceObject, 100 * sizeof(WCHAR), Descriptor->iFunction, 0x0409, //FIXME (PVOID*)&DescriptionBuffer); if (!NT_SUCCESS(Status)) { // // no description // RtlInitUnicodeString(&FunctionDescriptor->FunctionDescription, L""); } else { // // init description // RtlInitUnicodeString(&FunctionDescriptor->FunctionDescription, DescriptionBuffer); } DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor->FunctionDescription); }
// // now init hardware id // Index = swprintf(Buffer, L"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x", FDODeviceExtension->DeviceDescriptor->idVendor, FDODeviceExtension->DeviceDescriptor->idProduct, FDODeviceExtension->DeviceDescriptor->bcdDevice, Descriptor->bFirstInterface) + 1; Index += swprintf(&Buffer[Index], L"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension->DeviceDescriptor->idVendor, FDODeviceExtension->DeviceDescriptor->idProduct, Descriptor->bFirstInterface) + 1;
// allocate result buffer DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR)); if (!DescriptionBuffer) { // // failed to allocate memory // return STATUS_INSUFFICIENT_RESOURCES; }
// copy description RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR)); FunctionDescriptor->HardwareId.Buffer = DescriptionBuffer; FunctionDescriptor->HardwareId.Length = Index * sizeof(WCHAR); FunctionDescriptor->HardwareId.MaximumLength = (Index + 1) * sizeof(WCHAR);
// // now init the compatible id // Index = swprintf(Buffer, L"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor->bFunctionClass, Descriptor->bFunctionSubClass, Descriptor->bFunctionProtocol) + 1; Index += swprintf(&Buffer[Index], L"USB\\Class_%02x&SubClass_%02x", Descriptor->bFunctionClass, Descriptor->bFunctionSubClass) + 1; Index += swprintf(&Buffer[Index], L"USB\\Class_%02x", Descriptor->bFunctionClass) + 1;
// allocate result buffer DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR)); if (!DescriptionBuffer) { // // failed to allocate memory // return STATUS_INSUFFICIENT_RESOURCES; }
// copy description RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR)); FunctionDescriptor->CompatibleId.Buffer = DescriptionBuffer; FunctionDescriptor->CompatibleId.Length = Index * sizeof(WCHAR); FunctionDescriptor->CompatibleId.MaximumLength = (Index + 1) * sizeof(WCHAR);
// // done // return STATUS_SUCCESS;}
NTSTATUSUSBCCGP_EnumWithAssociationDescriptor( IN PDEVICE_OBJECT DeviceObject){ ULONG DescriptorCount, Index; PFDO_DEVICE_EXTENSION FDODeviceExtension; NTSTATUS Status = STATUS_SUCCESS;
// // get device extension // FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; ASSERT(FDODeviceExtension->Common.IsFDO);
// // count association descriptors // DescriptorCount = USBCCGP_CountAssociationDescriptors(FDODeviceExtension->ConfigurationDescriptor); if (!DescriptorCount) { // // no descriptors found // return STATUS_NOT_SUPPORTED; }
// // allocate function descriptor array // FDODeviceExtension->FunctionDescriptor = AllocateItem(NonPagedPool, sizeof(USBC_FUNCTION_DESCRIPTOR) * DescriptorCount); if (!FDODeviceExtension->FunctionDescriptor) { // // no memory // DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count %x\n", DescriptorCount); return STATUS_INSUFFICIENT_RESOURCES; }
for (Index = 0; Index < DescriptorCount; Index++) { // // init function descriptors // Status = USBCCGP_InitFunctionDescriptor(FDODeviceExtension, Index, &FDODeviceExtension->FunctionDescriptor[Index]); if (!NT_SUCCESS(Status)) { // // failed // return Status; } }
// // store function descriptor count // FDODeviceExtension->FunctionDescriptorCount = DescriptorCount;
// // done // return Status;}
NTSTATUSUSBCCG_InitIdsWithInterfaceDescriptor( IN PFDO_DEVICE_EXTENSION FDODeviceExtension, IN PUSB_INTERFACE_DESCRIPTOR Descriptor, IN ULONG FunctionIndex, OUT PUSBC_FUNCTION_DESCRIPTOR FunctionDescriptor){ ULONG Index; WCHAR Buffer[200]; LPWSTR DescriptionBuffer; NTSTATUS Status;
// // now init interface description // if (Descriptor->iInterface) { // // get interface description // Status = USBCCGP_GetStringDescriptor(FDODeviceExtension->NextDeviceObject, 100 * sizeof(WCHAR), Descriptor->iInterface, 0x0409, //FIXME (PVOID*)&DescriptionBuffer); if (!NT_SUCCESS(Status)) { // // no description // RtlInitUnicodeString(&FunctionDescriptor->FunctionDescription, L""); } else { // // init description // RtlInitUnicodeString(&FunctionDescriptor->FunctionDescription, DescriptionBuffer); } DPRINT1("FunctionDescription %wZ\n", &FunctionDescriptor->FunctionDescription); }
// // now init hardware id // Index = swprintf(Buffer, L"USB\\VID_%04x&PID_%04x&Rev_%04x&MI_%02x", FDODeviceExtension->DeviceDescriptor->idVendor, FDODeviceExtension->DeviceDescriptor->idProduct, FDODeviceExtension->DeviceDescriptor->bcdDevice, FunctionIndex) + 1; Index += swprintf(&Buffer[Index], L"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension->DeviceDescriptor->idVendor, FDODeviceExtension->DeviceDescriptor->idProduct, FunctionIndex) + 1;
// allocate result buffer DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR)); if (!DescriptionBuffer) { // // failed to allocate memory // return STATUS_INSUFFICIENT_RESOURCES; }
// copy description RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR)); FunctionDescriptor->HardwareId.Buffer = DescriptionBuffer; FunctionDescriptor->HardwareId.Length = Index * sizeof(WCHAR); FunctionDescriptor->HardwareId.MaximumLength = (Index + 1) * sizeof(WCHAR);
// // now init the compatible id // Index = swprintf(Buffer, L"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor->bInterfaceClass, Descriptor->bInterfaceSubClass, Descriptor->bInterfaceProtocol) + 1; Index += swprintf(&Buffer[Index], L"USB\\Class_%02x&SubClass_%02x", Descriptor->bInterfaceClass, Descriptor->bInterfaceSubClass) + 1; Index += swprintf(&Buffer[Index], L"USB\\Class_%02x", Descriptor->bInterfaceClass) + 1;
// allocate result buffer DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR)); if (!DescriptionBuffer) { // // failed to allocate memory // return STATUS_INSUFFICIENT_RESOURCES; }
// copy description RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR)); FunctionDescriptor->CompatibleId.Buffer = DescriptionBuffer; FunctionDescriptor->CompatibleId.Length = Index * sizeof(WCHAR); FunctionDescriptor->CompatibleId.MaximumLength = (Index + 1) * sizeof(WCHAR);
// // done // return STATUS_SUCCESS;}
NTSTATUSUSBCCGP_LegacyEnum( IN PDEVICE_OBJECT DeviceObject){ ULONG Index, SubIndex; PFDO_DEVICE_EXTENSION FDODeviceExtension; NTSTATUS Status = STATUS_SUCCESS; PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, NextInterfaceDescriptor;
// // get device extension // FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; ASSERT(FDODeviceExtension->Common.IsFDO);
// // sanity check // ASSERT(FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces);
// // allocate function array // FDODeviceExtension->FunctionDescriptor = AllocateItem(NonPagedPool, sizeof(USBC_FUNCTION_DESCRIPTOR) * FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces); if (!FDODeviceExtension->FunctionDescriptor) { // // no memory // DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor %lu\n", FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces); return STATUS_INSUFFICIENT_RESOURCES; }
// // init function descriptors // FDODeviceExtension->FunctionDescriptorCount = FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; for (Index = 0; Index < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; Index++) { // get interface descriptor InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index, 0, -1, -1, -1); if (InterfaceDescriptor == NULL) { // // failed to find interface descriptor // DPRINT1("[USBCCGP] Failed to find interface descriptor index %lu\n", Index); ASSERT(FALSE); return STATUS_UNSUCCESSFUL; }
SubIndex = 0; if (InterfaceDescriptor->bInterfaceClass == USB_DEVICE_CLASS_AUDIO) { // AUDIO CLASS lets group all audio interfaces together // // init function descriptor // FDODeviceExtension->FunctionDescriptor[Index].FunctionNumber = Index; FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces = 1; FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR) * FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces); if (!FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList) { // // no memory // FreeItem(FDODeviceExtension->FunctionDescriptor); FDODeviceExtension->FunctionDescriptor = NULL; FDODeviceExtension->FunctionDescriptorCount = 0; return STATUS_INSUFFICIENT_RESOURCES; }
// // store interface descriptor // FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[SubIndex] = InterfaceDescriptor; while (TRUE) { NextInterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index + SubIndex + 1, 0, -1, -1, -1); if (!NextInterfaceDescriptor || NextInterfaceDescriptor->bInterfaceClass != USB_DEVICE_CLASS_AUDIO) { // end of collection break; } SubIndex++; ASSERT(SubIndex < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces); FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces++; FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[SubIndex] = NextInterfaceDescriptor; } } else { // // init function descriptor // FDODeviceExtension->FunctionDescriptor[Index].FunctionNumber = Index; FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces = 1; FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR)); if (!FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList) { // // no memory // return STATUS_INSUFFICIENT_RESOURCES; }
// // store interface descriptor // FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[0] = InterfaceDescriptor; }
// // now init the device ids // Status = USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension, InterfaceDescriptor, Index, &FDODeviceExtension->FunctionDescriptor[Index]); if (!NT_SUCCESS(Status)) { // // failed to init ids // DPRINT1("[USBCCGP] Failed to init ids with %lx\n", Status); return Status; } // // increment interface count // Index += SubIndex; }
// // done // return Status;}
NTSTATUSUSBCCGP_EnumWithUnionFunctionDescriptors( IN PDEVICE_OBJECT DeviceObject){ UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED;}
NTSTATUSUSBCCGP_EnumWithAudioLegacy( IN PDEVICE_OBJECT DeviceObject){ ULONG Index; PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, FirstDescriptor = NULL; PFDO_DEVICE_EXTENSION FDODeviceExtension; NTSTATUS Status = STATUS_SUCCESS;
// // get device extension // FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; ASSERT(FDODeviceExtension->Common.IsFDO);
// // first check if all interfaces belong to the same audio class // for (Index = 0; Index < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; Index++) { // // get interface descriptor // InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index, 0, -1, -1, -1); DPRINT1("Index %lu Descriptor %p\n", Index, InterfaceDescriptor); ASSERT(InterfaceDescriptor);
if (InterfaceDescriptor->bInterfaceClass != USB_DEVICE_CLASS_AUDIO) { // // collection contains non audio class // return STATUS_UNSUCCESSFUL; }
if (FirstDescriptor == NULL) { // // store interface descriptor // FirstDescriptor = InterfaceDescriptor; continue; }
if (FirstDescriptor->bInterfaceSubClass == InterfaceDescriptor->bInterfaceSubClass) { // // interface subclass must be different from the first interface // return STATUS_UNSUCCESSFUL; } }
// // this is an composite audio device // DPRINT("[USBCCGP] Audio Composite Device detected\n");
// // audio interfaces are all grouped into one single function // FDODeviceExtension->FunctionDescriptor = AllocateItem(NonPagedPool, sizeof(USBC_FUNCTION_DESCRIPTOR)); if (!FDODeviceExtension->FunctionDescriptor) { // // no memory // DPRINT1("USBCCGP_EnumWithAssociationDescriptor failed to allocate function descriptor count\n"); return STATUS_INSUFFICIENT_RESOURCES; }
// // init function number // FDODeviceExtension->FunctionDescriptor[0].FunctionNumber = 0;
// // store interfaces // Status = AllocateInterfaceDescriptorsArray(FDODeviceExtension->ConfigurationDescriptor, &FDODeviceExtension->FunctionDescriptor[0].InterfaceDescriptorList); if (!NT_SUCCESS(Status)) { // // failed to allocate descriptor array // DPRINT1("[USBCCGP] Failed to allocate descriptor array %lx\n", Status); return Status; }
// // now init the device ids // Status = USBCCG_InitIdsWithInterfaceDescriptor(FDODeviceExtension, FirstDescriptor, 0, &FDODeviceExtension->FunctionDescriptor[0]); if (!NT_SUCCESS(Status)) { // // failed to init ids // DPRINT1("[USBCCGP] Failed to init ids with %lx\n", Status); return Status; }
// // number of interfaces // FDODeviceExtension->FunctionDescriptor[0].NumberOfInterfaces = FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces;
// // store function count // FDODeviceExtension->FunctionDescriptorCount = 1;
// // done // return STATUS_SUCCESS;}
NTSTATUSUSBCCGP_EnumerateFunctions( IN PDEVICE_OBJECT DeviceObject){ NTSTATUS Status; PFDO_DEVICE_EXTENSION FDODeviceExtension;
// // get device extension // FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; ASSERT(FDODeviceExtension->Common.IsFDO);
// // first try with filter driver // Status = USBCCGP_CustomEnumWithInterface(DeviceObject); if (NT_SUCCESS(Status)) { // // succeeded // return Status; }
// // enumerate functions with interface association descriptor // Status = USBCCGP_EnumWithAssociationDescriptor(DeviceObject); if (NT_SUCCESS(Status)) { // // succeeded // return Status; }
#if 0 // // try with union function descriptors // Status = USBCCGP_EnumWithUnionFunctionDescriptors(DeviceObject); if (NT_SUCCESS(Status)) { // // succeeded // return Status; }#endif
// // try with legacy audio methods // Status = USBCCGP_EnumWithAudioLegacy(DeviceObject); if (NT_SUCCESS(Status)) { // // succeeded // return Status; }
// // try with legacy enumeration // return USBCCGP_LegacyEnum(DeviceObject);}