On 2016-10-21 23:15, [email protected] 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
_______________________________________________
Ros-dev mailing list
[email protected]
http://www.reactos.org/mailman/listinfo/ros-dev