On 2016-10-21 23:15, janderwald@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