mirror of
https://github.com/reactos/reactos.git
synced 2025-07-29 15:22:21 +00:00
- Add a few sanity assert to KsCreate
- Pass a create item and use an object class when creating an object header - Return zero mixer count when wdmaud fails to enumerate virtual device count - Should fix high cpu usage after installing audio drivers svn path=/trunk/; revision=41357
This commit is contained in:
parent
999d0e50c9
commit
de4dace673
5 changed files with 28 additions and 6 deletions
|
@ -759,7 +759,13 @@ KsCreate(
|
|||
}
|
||||
else if (DeviceHeader->ItemList[Index].bCreated && IoStack->FileObject->FileName.Buffer != NULL)
|
||||
{
|
||||
ULONG Length = wcslen(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer);
|
||||
ULONG Length;
|
||||
|
||||
ASSERT(DeviceHeader->ItemList[Index].ObjectHeader);
|
||||
ASSERT(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem);
|
||||
ASSERT(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer);
|
||||
|
||||
Length = wcslen(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer);
|
||||
|
||||
/* filter for that type has already exists */
|
||||
if (!_wcsnicmp(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer,
|
||||
|
|
|
@ -189,6 +189,7 @@ DispatchCreateKMix(
|
|||
KSOBJECT_HEADER ObjectHeader;
|
||||
PIO_STACK_LOCATION IoStatus;
|
||||
LPWSTR Buffer;
|
||||
PKSOBJECT_CREATE_ITEM CreateItem;
|
||||
|
||||
static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}";
|
||||
|
||||
|
@ -211,8 +212,23 @@ DispatchCreateKMix(
|
|||
}
|
||||
}
|
||||
|
||||
/* allocate create item */
|
||||
CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
|
||||
if (!CreateItem)
|
||||
{
|
||||
Irp->IoStatus.Information = 0;
|
||||
Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
/* zero create struct */
|
||||
RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
|
||||
|
||||
RtlInitUnicodeString(&CreateItem->ObjectClass, L"KMixer");
|
||||
|
||||
/* allocate object header */
|
||||
Status = KsAllocateObjectHeader(&ObjectHeader, 0, NULL, Irp, &DispatchTable);
|
||||
Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
|
||||
|
||||
DPRINT("KsAllocateObjectHeader result %x\n", Status);
|
||||
/* complete the irp */
|
||||
|
|
|
@ -133,7 +133,6 @@ GetNumOfMixerDevices(
|
|||
NTSTATUS Status;
|
||||
PWDMAUD_DEVICE_EXTENSION DeviceExtension;
|
||||
|
||||
|
||||
Pin.Property.Set = KSPROPSETID_Sysaudio;
|
||||
Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT;
|
||||
Pin.Property.Flags = KSPROPERTY_TYPE_GET;
|
||||
|
@ -143,7 +142,7 @@ GetNumOfMixerDevices(
|
|||
Count = 0;
|
||||
Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned);
|
||||
if (!NT_SUCCESS(Status) || !Count)
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
return 0;
|
||||
|
||||
NumPins = 0;
|
||||
for(Index = 0; Index < Count; Index++)
|
||||
|
|
|
@ -256,7 +256,7 @@ CreateMixerPinAndSetFormat(
|
|||
HANDLE PinHandle;
|
||||
PFILE_OBJECT FileObject;
|
||||
|
||||
Status = KsCreatePin(KMixerHandle, PinConnect, GENERIC_READ | GENERIC_WRITE, &PinHandle);
|
||||
Status = KsoCreatePin(KMixerHandle, PinConnect, GENERIC_READ | GENERIC_WRITE, &PinHandle, L"KMixer");
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
|
@ -419,7 +419,7 @@ CreatePinWorkerRoutine(
|
|||
|
||||
DPRINT1("creating virtual pin\n");
|
||||
/* now create the virtual audio pin which is exposed to wdmaud */
|
||||
Status = KsCreatePin(Filter, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &VirtualPinHandle);
|
||||
Status = KsoCreatePin(Filter, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &VirtualPinHandle, L"SysAudio");
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
|
|
|
@ -346,6 +346,7 @@ DispatchCreateSysAudio(
|
|||
|
||||
/* store create context */
|
||||
CreateItem->Context = (PVOID)Client;
|
||||
RtlInitUnicodeString(&CreateItem->ObjectClass, L"SysAudio");
|
||||
|
||||
/* store the object in FsContext */
|
||||
IoStatus->FileObject->FsContext2 = (PVOID)Client;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue