- 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:
Johannes Anderwald 2009-06-09 14:50:24 +00:00
parent 999d0e50c9
commit de4dace673
5 changed files with 28 additions and 6 deletions

View file

@ -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,

View file

@ -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 */

View file

@ -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++)

View file

@ -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))
{

View file

@ -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;