On 2016-10-21 23:15, janderwald(a)svn.reactos.org wrote:
   NTSTATUS
 +NTAPI
 +USBAudioGetDescriptor(
 +    IN PDEVICE_OBJECT DeviceObject,
 +    IN UCHAR DescriptorType,
 +    IN ULONG DescriptorLength,
 +    IN UCHAR DescriptorIndex,
 +    IN LANGID LanguageId,
 +    OUT PVOID *OutDescriptor)
 +{
 +    PURB Urb;
 +    NTSTATUS Status;
 +    PVOID Descriptor;
 +
 +    /* sanity checks */
 +    ASSERT(DeviceObject);
 +    ASSERT(OutDescriptor);
 +    ASSERT(DescriptorLength);
 +
 +    //
 +    // first allocate descriptor buffer
 +    //
 +    Descriptor = AllocFunction(DescriptorLength);
 +    if (!Descriptor)
 +    {
 +        /* no memory */
 +        return STATUS_INSUFFICIENT_RESOURCES;
 +    }
 +
 +    /* allocate urb */
 +    Urb = (PURB)AllocFunction(sizeof(URB));
 +    if (!Urb)
 +    {
 +        /* no memory */
 +        FreeFunction(Descriptor);
 +        return STATUS_INSUFFICIENT_RESOURCES;
 +    }
 +
 +    /* initialize urb */
 +    UsbBuildGetDescriptorRequest(Urb,
 +        sizeof(Urb->UrbControlDescriptorRequest),
 +        DescriptorType,
 +        DescriptorIndex,
 +        LanguageId,
 +        Descriptor,
 +        NULL,
 +        DescriptorLength,
 +        NULL);
 +
 +    /* submit urb */
 +    Status = SubmitUrbSync(DeviceObject, Urb);
 +
 +    /* free urb */
 +    FreeFunction(Urb);
 +
 +    if (NT_SUCCESS(Status))
 +    {
 +        /* store result */
 +        *OutDescriptor = Descriptor;
 +    } 
Is Descriptor leaked in the failure case, or does something down the
stack take care of that?
  +
 +    /* done */
 +    return Status;
 +} 
  +NTSTATUS
 +USBAudioRegCreateMediaCategoriesKey(
 +    IN PUNICODE_STRING Name,
 +    OUT PHANDLE OutHandle)
 +{
 +    NTSTATUS Status;
 +    OBJECT_ATTRIBUTES ObjectAttributes;
 +    UNICODE_STRING DestinationString;
 +    HANDLE Handle;
 +
 +    /* initialize root name*/
 +    RtlInitUnicodeString(&DestinationString,
L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\MediaCategories\\");
 +
 +    /* initialize object attributes */
 +    InitializeObjectAttributes(&ObjectAttributes, &DestinationString,
OBJ_CASE_INSENSITIVE | OBJ_OPENIF, NULL, NULL); 
You're missing OBJ_KERNEL_HANDLE.
  +
 +    /* create the key */
 +    Status = ZwOpenKey(&Handle, KEY_ALL_ACCESS, &ObjectAttributes);
 +    if (NT_SUCCESS(Status))
 +    {
 +        /* initialize object attributes */
 +        InitializeObjectAttributes(&ObjectAttributes, Name, OBJ_CASE_INSENSITIVE,
Handle, NULL); 
Here too.
  +
 +        Status = ZwCreateKey(OutHandle, KEY_ALL_ACCESS, &ObjectAttributes, 0, NULL,
0, NULL);
 +        ZwClose(Handle);
 +
 +    }
 +    return Status;
 +} 
Thanks.
-Thomas