From 6fd2ea71d25cdaa879d9742e432563109dff94ef Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 12 Sep 2009 14:35:27 +0000 Subject: [PATCH] [KS] - Store Object Header in FsContext2 - Fix allocation of create item entry in KsAllocateObjectCreateItem - Fix de-referencing in Ks[De]ReferenceSoftwareBusObject & Ks[De]ReferenceBusObject - Fake success in KsEnableEvent - Check if the list empty in KspFreeEventList - Handle GUID_NULL in KspPropertyHandler - Return STATUS_MORE_ENTRIES if outputbuffer is too small - Zero struct in KsRegisterWorker [PORTCLS] - Store dispatch context in FsContext - Ignore return value in interrupt sync routine [[Amine Khaldi]] - Disable assert for frame size check for now - Free buffer only if the irp was from kernel mode(hack 2 be removed) - remove unused includes [[Amine Khaldi]] - Don't attempt copying an empty resource list [[Amine Khaldi]] [WDMAUD_KERNEL] - Check if allocation succeeded [[Amine Khaldi]] [SYSAUDIO] - Store dispatch context in FsContext2 svn path=/trunk/; revision=43035 --- reactos/drivers/ksfilter/ks/allocators.c | 2 +- reactos/drivers/ksfilter/ks/api.c | 17 ++++----- reactos/drivers/ksfilter/ks/connectivity.c | 2 ++ reactos/drivers/ksfilter/ks/device.c | 15 ++++---- reactos/drivers/ksfilter/ks/event.c | 9 +++-- reactos/drivers/ksfilter/ks/filter.c | 4 +-- reactos/drivers/ksfilter/ks/irp.c | 23 +++++++++--- reactos/drivers/ksfilter/ks/misc.c | 6 ++-- reactos/drivers/ksfilter/ks/pin.c | 10 +++--- reactos/drivers/ksfilter/ks/property.c | 34 ++++++++++++++---- reactos/drivers/ksfilter/ks/topology.c | 2 ++ reactos/drivers/ksfilter/ks/worker.c | 7 ++-- .../wdm/audio/backpln/portcls/dispatcher.cpp | 22 ++++++------ .../wdm/audio/backpln/portcls/interrupt.cpp | 2 +- .../wdm/audio/backpln/portcls/irpstream.cpp | 4 +-- .../wdm/audio/backpln/portcls/private.hpp | 5 --- .../audio/backpln/portcls/propertyhandler.cpp | 2 +- .../wdm/audio/backpln/portcls/registry.cpp | 1 + .../wdm/audio/backpln/portcls/resource.cpp | 13 +++++-- .../wdm/audio/backpln/portcls/undoc.cpp | 4 +-- .../drivers/wdm/audio/legacy/wdmaud/control.c | 25 ++++++++----- reactos/drivers/wdm/audio/sysaudio/control.c | 4 +-- reactos/drivers/wdm/audio/sysaudio/pin.c | 35 +++++++++---------- reactos/drivers/wdm/audio/sysaudio/sysaudio.h | 5 +-- 24 files changed, 156 insertions(+), 97 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/allocators.c b/reactos/drivers/ksfilter/ks/allocators.c index 9880dea7ce8..6382fd7672c 100644 --- a/reactos/drivers/ksfilter/ks/allocators.c +++ b/reactos/drivers/ksfilter/ks/allocators.c @@ -445,7 +445,7 @@ IKsAllocator_DispatchRequest( ASSERT(FileObject); /* get object header */ - Header = (PKSIOBJECT_HEADER)FileObject->FsContext; + Header = (PKSIOBJECT_HEADER)FileObject->FsContext2; /* get real allocator */ Status = Header->Unknown->lpVtbl->QueryInterface(Header->Unknown, &IID_IKsAllocator, (PVOID*)&Allocator); diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c index 059d7a223bf..7d22c40d861 100644 --- a/reactos/drivers/ksfilter/ks/api.c +++ b/reactos/drivers/ksfilter/ks/api.c @@ -494,8 +494,8 @@ KspFreeCreateItems( Entry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(RemoveHeadList(ListHead), CREATE_ITEM_ENTRY, Entry); /* caller shouldnt have any references */ - ASSERT(Entry->ReferenceCount == 0); - ASSERT(IsListEmpty(&Entry->ObjectItemList)); + //ASSERT(Entry->ReferenceCount == 0); + //ASSERT(IsListEmpty(&Entry->ObjectItemList)); /* does the creator wish notification */ if (Entry->ItemFreeCallback) @@ -687,8 +687,7 @@ KsAllocateObjectHeader( } } /* store the object in the file object */ - ASSERT(IoStack->FileObject->FsContext == NULL); - IoStack->FileObject->FsContext = ObjectHeader; + IoStack->FileObject->FsContext2 = ObjectHeader; /* store parent device */ ObjectHeader->ParentDeviceObject = IoGetRelatedDeviceObject(IoStack->FileObject); @@ -720,6 +719,8 @@ KsFreeObjectHeader( { PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER) Header; + DPRINT1("KsFreeObjectHeader Header %p Class %wZ\n", Header, &ObjectHeader->ObjectClass); + if (ObjectHeader->ObjectClass.Buffer) { /* release object class buffer */ @@ -825,7 +826,7 @@ KsAddObjectCreateItemToDeviceHeader( /* increment create item count */ InterlockedIncrement(&Header->ItemListCount); } - + DPRINT("KsAddObjectCreateItemToDeviceHeader Status %x\n", Status); return Status; } @@ -898,7 +899,7 @@ KsAllocateObjectCreateItem( return STATUS_INVALID_PARAMETER_2; /* first allocate a create entry */ - CreateEntry = AllocateItem(NonPagedPool, sizeof(PCREATE_ITEM_ENTRY)); + CreateEntry = AllocateItem(NonPagedPool, sizeof(CREATE_ITEM_ENTRY)); /* check for allocation success */ if (!CreateEntry) @@ -1121,7 +1122,7 @@ KsSynchronousIoControlDevice( /* get object header */ - ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2; /* check if there is fast device io function */ if (ObjectHeader && ObjectHeader->DispatchTable.FastDeviceIoControl) @@ -1129,7 +1130,7 @@ KsSynchronousIoControlDevice( IoStatusBlock.Status = STATUS_UNSUCCESSFUL; IoStatusBlock.Information = 0; - /* it is send the request */ + /* send the request */ Status = ObjectHeader->DispatchTable.FastDeviceIoControl(FileObject, TRUE, InBuffer, InSize, OutBuffer, OutSize, IoControl, &IoStatusBlock, DeviceObject); /* check if the request was handled */ //DPRINT("Handled %u Status %x Length %u\n", Status, IoStatusBlock.Status, IoStatusBlock.Information); diff --git a/reactos/drivers/ksfilter/ks/connectivity.c b/reactos/drivers/ksfilter/ks/connectivity.c index bd493803f30..02c36e772e9 100644 --- a/reactos/drivers/ksfilter/ks/connectivity.c +++ b/reactos/drivers/ksfilter/ks/connectivity.c @@ -200,6 +200,8 @@ KsPinPropertyHandler( IoStack = IoGetCurrentIrpStackLocation(Irp); Buffer = Irp->UserBuffer; + DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %x\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id); + switch(Property->Id) { case KSPROPERTY_PIN_CTYPES: diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c index 82024ca861d..c5c5d26e818 100644 --- a/reactos/drivers/ksfilter/ks/device.c +++ b/reactos/drivers/ksfilter/ks/device.c @@ -570,7 +570,7 @@ IKsDevice_Create( if (IoStack->FileObject->RelatedFileObject != NULL) { /* request is to instantiate a pin / node / clock / allocator */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext2; /* sanity check */ ASSERT(ObjectHeader); @@ -717,7 +717,7 @@ KsReferenceSoftwareBusObject( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; if (Device) { @@ -741,7 +741,7 @@ KsReferenceBusObject( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; if (Device) { @@ -766,7 +766,7 @@ KsDereferenceBusObject( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; if (Device) { @@ -783,11 +783,14 @@ VOID NTAPI KsDereferenceSoftwareBusObject( IN KSDEVICE_HEADER Header) -{ IKsDevice * Device; +{ + IKsDevice * Device; PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; + DPRINT1("KsDereferenceSoftwareBusObject DeviceHeader %p\n", Header); + /* get device interface */ - Device = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; + Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; if (Device) { diff --git a/reactos/drivers/ksfilter/ks/event.c b/reactos/drivers/ksfilter/ks/event.c index f9231a5dda8..eae342a6ebe 100644 --- a/reactos/drivers/ksfilter/ks/event.c +++ b/reactos/drivers/ksfilter/ks/event.c @@ -87,7 +87,7 @@ KsEnableEvent( IN PVOID EventsLock OPTIONAL) { UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; + return STATUS_SUCCESS; } /* @@ -218,7 +218,7 @@ NTAPI KsDiscardEvent( IN PKSEVENT_ENTRY EventEntry) { - UNIMPLEMENTED; + //UNIMPLEMENTED; } @@ -234,6 +234,9 @@ KspFreeEventList( if (!Ctx || !Ctx->List) return FALSE; + if (IsListEmpty(Ctx->List)) + return FALSE; + /* remove first entry */ Entry = RemoveHeadList(Ctx->List); if (!Entry) @@ -358,7 +361,7 @@ KsDefaultAddEventHandler( IoStack = IoGetCurrentIrpStackLocation(Irp); /* now get the object header */ - ObjectHeader =(PKSIOBJECT_HEADER)IoStack->FileObject->FsContext; + ObjectHeader =(PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; /* sanity check */ ASSERT(ObjectHeader->ObjectType); diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c index edc91ac7876..7a8e5b2defc 100644 --- a/reactos/drivers/ksfilter/ks/filter.c +++ b/reactos/drivers/ksfilter/ks/filter.c @@ -444,7 +444,7 @@ IKsFilter_GetFilterFromIrp( /* santiy check */ ASSERT(IoStack->FileObject != NULL); - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; /* sanity is important */ ASSERT(ObjectHeader != NULL); @@ -1529,7 +1529,7 @@ KsGetFilterFromIrp( ASSERT(IoStack->FileObject); /* get object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; if (ObjectHeader->Type == KsObjectTypeFilter) { diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index 95ecb96f5e9..4d1ec7de7b9 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -555,7 +555,7 @@ KsStreamIo( if (RequestorMode || ExGetPreviousMode() == KernelMode) { /* requestor is from kernel land */ - ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2; if (ObjectHeader) { @@ -1348,6 +1348,8 @@ KsRemoveIrpFromCancelableQueue( PLIST_ENTRY CurEntry; KIRQL OldIrql; + DPRINT("KsRemoveIrpFromCancelableQueue ListHead %p SpinLock %p ListLocation %x RemovalOperation %x\n", QueueHead, SpinLock, ListLocation, RemovalOperation); + /* check parameters */ if (!QueueHead || !SpinLock) return NULL; @@ -1572,6 +1574,8 @@ KsRemoveSpecificIrpFromCancelableQueue( PKSPIN_LOCK SpinLock; KIRQL OldLevel; + DPRINT("KsRemoveSpecificIrpFromCancelableQueue %p\n", Irp); + /* get internal queue lock */ SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp); @@ -1603,6 +1607,7 @@ KsAddIrpToCancelableQueue( PIO_STACK_LOCATION IoStack; KIRQL OldLevel; + DPRINT1("KsAddIrpToCancelableQueue QueueHead %p SpinLock %p Irp %p ListLocation %x DriverCancel %p\n", QueueHead, SpinLock, Irp, ListLocation, DriverCancel); /* check for required parameters */ if (!QueueHead || !SpinLock || !Irp) return; @@ -1796,7 +1801,7 @@ KspCreate( if (IoStack->FileObject->RelatedFileObject != NULL) { /* request is to instantiate a pin / node / clock / allocator */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext2; /* sanity check */ ASSERT(ObjectHeader); @@ -1858,7 +1863,7 @@ KspDispatchIrp( ASSERT(IoStack->FileObject); /* get object header */ - ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext2; if (!ObjectHeader) { @@ -1931,12 +1936,19 @@ KsSetMajorFunctionHandler( IN PDRIVER_OBJECT DriverObject, IN ULONG MajorFunction) { + DPRINT("KsSetMajorFunctionHandler Function %x\n", MajorFunction); +#if 0 + // HACK + // for MS PORTCLS + // + DriverObject->MajorFunction[IRP_MJ_CREATE] = KspCreate; +#endif + switch ( MajorFunction ) { case IRP_MJ_CREATE: DriverObject->MajorFunction[MajorFunction] = KspCreate; break; - break; case IRP_MJ_DEVICE_CONTROL: case IRP_MJ_CLOSE: case IRP_MJ_READ: @@ -1947,6 +1959,7 @@ KsSetMajorFunctionHandler( DriverObject->MajorFunction[MajorFunction] = KspDispatchIrp; break; default: + DPRINT1("NotSupported %x\n", MajorFunction); return STATUS_INVALID_PARAMETER; }; @@ -1967,6 +1980,8 @@ KsDispatchIrp( PKSIDEVICE_HEADER DeviceHeader; PDEVICE_EXTENSION DeviceExtension; + DPRINT("KsDispatchIrp DeviceObject %p Irp %p\n", DeviceObject, Irp); + /* get device extension */ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; /* get device header */ diff --git a/reactos/drivers/ksfilter/ks/misc.c b/reactos/drivers/ksfilter/ks/misc.c index 14f78c03de3..c746602b092 100644 --- a/reactos/drivers/ksfilter/ks/misc.c +++ b/reactos/drivers/ksfilter/ks/misc.c @@ -151,7 +151,7 @@ KsGetObjectFromFileObject( PKSIOBJECT_HEADER ObjectHeader; /* get object header */ - ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2; /* return associated object */ return ObjectHeader->ObjectType; @@ -169,7 +169,7 @@ KsGetObjectTypeFromFileObject( PKSIOBJECT_HEADER ObjectHeader; /* get object header */ - ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2; /* return type */ return ObjectHeader->Type; } @@ -188,7 +188,7 @@ KsGetObjectTypeFromIrp( /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); /* get object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; /* return type */ return ObjectHeader->Type; } diff --git a/reactos/drivers/ksfilter/ks/pin.c b/reactos/drivers/ksfilter/ks/pin.c index 760c55f1b51..431fb2646f2 100644 --- a/reactos/drivers/ksfilter/ks/pin.c +++ b/reactos/drivers/ksfilter/ks/pin.c @@ -548,7 +548,7 @@ KsGetPinFromIrp( PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); /* get object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; /* return object type */ return (PKSPIN)ObjectHeader->ObjectType; @@ -904,10 +904,10 @@ IKsPin_DispatchDeviceIoControl( /* sanity check */ ASSERT(IoStack->FileObject); - ASSERT(IoStack->FileObject->FsContext); + ASSERT(IoStack->FileObject->FsContext2); /* get the object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; /* locate ks pin implemention fro KSPIN offset */ This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); @@ -961,10 +961,10 @@ IKsPin_Close( /* sanity check */ ASSERT(IoStack->FileObject); - ASSERT(IoStack->FileObject->FsContext); + ASSERT(IoStack->FileObject->FsContext2); /* get the object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext; + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; /* locate ks pin implemention fro KSPIN offset */ This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); diff --git a/reactos/drivers/ksfilter/ks/property.c b/reactos/drivers/ksfilter/ks/property.c index f7cba22d390..5204586c631 100644 --- a/reactos/drivers/ksfilter/ks/property.c +++ b/reactos/drivers/ksfilter/ks/property.c @@ -25,6 +25,8 @@ FindPropertyHandler( for(Index = 0; Index < PropertySetCount; Index++) { + ASSERT(PropertySet[Index].Set); + if (IsEqualGUIDAligned(&Property->Set, PropertySet[Index].Set)) { for(ItemIndex = 0; ItemIndex < PropertySet[Index].PropertiesCount; ItemIndex++) @@ -42,7 +44,7 @@ FindPropertyHandler( { /* too small output buffer */ IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData; - return STATUS_BUFFER_TOO_SMALL; + return STATUS_MORE_ENTRIES; } #if 0 if (Property->Flags & KSPROPERTY_TYPE_BASICSUPPORT) @@ -112,6 +114,8 @@ KspPropertyHandler( PIO_STACK_LOCATION IoStack; NTSTATUS Status; PFNKSHANDLER PropertyHandler = NULL; + ULONG Index; + LPGUID Guid; /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -126,17 +130,13 @@ KspPropertyHandler( /* FIXME probe the input / output buffer if from user mode */ - /* get input property request */ Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; + DPRINT("KspPropertyHandler Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM)); + /* sanity check */ ASSERT(PropertyItemSize == 0 || PropertyItemSize == sizeof(KSPROPERTY_ITEM)); - if (IsEqualGUIDAligned(&Property->Set, &KSPROPSETID_Topology)) - { - /* use KsTopologyPropertyHandler for this business */ - return STATUS_INVALID_PARAMETER; - } /* find the property handler */ Status = FindPropertyHandler(&Irp->IoStatus, PropertySet, PropertySetsCount, Property, IoStack->Parameters.DeviceIoControl.InputBufferLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Irp->UserBuffer, &PropertyHandler); @@ -166,6 +166,26 @@ KspPropertyHandler( } } } + else if (IsEqualGUIDAligned(&Property->Set, &GUID_NULL) && Property->Id == 0 && Property->Flags == KSPROPERTY_TYPE_SETSUPPORT) + { + // store output size + Irp->IoStatus.Information = sizeof(GUID) * PropertySetsCount; + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GUID) * PropertySetsCount) + { + // buffer too small + return STATUS_BUFFER_OVERFLOW; + } + + // get output buffer + Guid = (LPGUID)Irp->UserBuffer; + + // copy property guids from property sets + for(Index = 0; Index < PropertySetsCount; Index++) + { + RtlMoveMemory(&Guid[Index], PropertySet[Index].Set, sizeof(GUID)); + } + return STATUS_SUCCESS; + } /* done */ return Status; diff --git a/reactos/drivers/ksfilter/ks/topology.c b/reactos/drivers/ksfilter/ks/topology.c index 2eebbfc421c..861413ac6ab 100644 --- a/reactos/drivers/ksfilter/ks/topology.c +++ b/reactos/drivers/ksfilter/ks/topology.c @@ -160,6 +160,8 @@ KsTopologyPropertyHandler( HANDLE hKey; PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; + DPRINT("KsTopologyPropertyHandler Irp %p Property %p Data %p Topology %p\n", Irp, Property, Data, Topology); + if (Property->Flags != KSPROPERTY_TYPE_GET) { Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; diff --git a/reactos/drivers/ksfilter/ks/worker.c b/reactos/drivers/ksfilter/ks/worker.c index 12835ac441a..4dc983c1657 100644 --- a/reactos/drivers/ksfilter/ks/worker.c +++ b/reactos/drivers/ksfilter/ks/worker.c @@ -46,6 +46,9 @@ WorkItemRoutine( do { + /* sanity check */ + ASSERT(!IsListEmpty(&KsWorker->QueuedWorkItems)); + /* remove first entry */ Entry = RemoveHeadList(&KsWorker->QueuedWorkItems); /* get offset to work item */ @@ -95,7 +98,7 @@ KsRegisterWorker( } /* allocate worker context */ - KsWorker = ExAllocatePool(NonPagedPool, sizeof(KSIWORKER)); + KsWorker = AllocateItem(NonPagedPool, sizeof(KSIWORKER)); if (!KsWorker) return STATUS_INSUFFICIENT_RESOURCES; @@ -103,8 +106,6 @@ KsRegisterWorker( ExInitializeWorkItem(&KsWorker->WorkItem, WorkItemRoutine, (PVOID)KsWorker); /* setup type */ KsWorker->Type = WorkQueueType; - /* set counter to zero */ - KsWorker->Counter = 0; /* Initialize work item queue */ InitializeListHead(&KsWorker->QueuedWorkItems); /* initialize work item lock */ diff --git a/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.cpp b/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.cpp index bc01c9819e4..81953425c4f 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.cpp @@ -22,7 +22,7 @@ Dispatch_fnDeviceIoControl( IoStack = IoGetCurrentIrpStackLocation(Irp); // access IrpTarget - IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2; + IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext; // let IrpTarget handle request return IrpTarget->DeviceIoControl(DeviceObject, Irp); @@ -41,7 +41,7 @@ Dispatch_fnRead( IoStack = IoGetCurrentIrpStackLocation(Irp); // access IrpTarget - IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2; + IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext; // let IrpTarget handle request @@ -61,7 +61,7 @@ Dispatch_fnWrite( IoStack = IoGetCurrentIrpStackLocation(Irp); // access IrpTarget - IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2; + IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext; // let IrpTarget handle request @@ -81,7 +81,7 @@ Dispatch_fnFlush( IoStack = IoGetCurrentIrpStackLocation(Irp); // access IrpTarget - IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2; + IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext; // let IrpTarget handle request @@ -101,7 +101,7 @@ Dispatch_fnClose( IoStack = IoGetCurrentIrpStackLocation(Irp); // access IrpTarget - IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2; + IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext; // let IrpTarget handle request @@ -121,7 +121,7 @@ Dispatch_fnQuerySecurity( IoStack = IoGetCurrentIrpStackLocation(Irp); // access IrpTarget - IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2; + IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext; // let IrpTarget handle request @@ -141,7 +141,7 @@ Dispatch_fnSetSecurity( IoStack = IoGetCurrentIrpStackLocation(Irp); // access IrpTarget - IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2; + IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext; // let IrpTarget handle request @@ -164,7 +164,7 @@ Dispatch_fnFastDeviceIoControl( IIrpTarget * IrpTarget; // access IrpTarget - IrpTarget = (IIrpTarget *)FileObject->FsContext2; + IrpTarget = (IIrpTarget *)FileObject->FsContext; // let IrpTarget handle request return IrpTarget->FastDeviceIoControl(FileObject, Wait, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, IoControlCode, IoStatus, DeviceObject); @@ -186,7 +186,7 @@ Dispatch_fnFastRead( IIrpTarget * IrpTarget; // access IrpTarget - IrpTarget = (IIrpTarget *)FileObject->FsContext2; + IrpTarget = (IIrpTarget *)FileObject->FsContext; // let IrpTarget handle request return IrpTarget->FastRead(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject); @@ -207,7 +207,7 @@ Dispatch_fnFastWrite( IIrpTarget * IrpTarget; // access IrpTarget - IrpTarget = (IIrpTarget *)FileObject->FsContext2; + IrpTarget = (IIrpTarget *)FileObject->FsContext; // let IrpTarget handle request return IrpTarget->FastWrite(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject); } @@ -242,7 +242,7 @@ NewDispatchObject( // get current irp stack location IoStack = IoGetCurrentIrpStackLocation(Irp); - IoStack->FileObject->FsContext2 = (PVOID)Target; + IoStack->FileObject->FsContext = (PVOID)Target; Status = KsAllocateObjectHeader(&ObjectHeader, CreateItemCount, CreateItem, Irp, &DispatchTable); DPRINT("KsAllocateObjectHeader result %x\n", Status); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interrupt.cpp b/reactos/drivers/wdm/audio/backpln/portcls/interrupt.cpp index a957fc1deef..22446780d16 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/interrupt.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/interrupt.cpp @@ -180,7 +180,7 @@ IInterruptServiceRoutine( while (CurEntry != &This->m_ServiceRoutines) { Entry = CONTAINING_RECORD(CurEntry, SYNC_ENTRY, ListEntry); - Status = Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext); + Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext); CurEntry = CurEntry->Flink; } DPRINT("Returning TRUE with mode InterruptSyncModeAll\n"); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp index b5753e05b6a..b7a7d72ed93 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp @@ -147,7 +147,7 @@ CIrpQueue::AddMapping( PC_ASSERT(Header); // dont exceed max frame size - PC_ASSERT(m_MaxFrameSize >= Header->DataUsed); + //PC_ASSERT(m_MaxFrameSize >= Header->DataUsed); // increment num mappings InterlockedIncrement(&m_NumMappings); @@ -282,7 +282,7 @@ CIrpQueue::UpdateMapping( m_Irp->IoStatus.Information = StreamHeader->FrameExtent; - if (m_Irp->RequestorMode != KernelMode) + if (m_Irp->RequestorMode == KernelMode) { // HACK - WDMAUD should pass PKSSTREAM_HEADERs ExFreePool(StreamHeader->Data); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.hpp b/reactos/drivers/wdm/audio/backpln/portcls/private.hpp index 9d173658e3d..e530f21be27 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.hpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.hpp @@ -17,16 +17,11 @@ #include #include -#include "stdunk.h" #include "interfaces.hpp" #include #include -#include -#include #include -#include - #define TAG_PORTCLASS 'SLCP' #define PC_ASSERT(exp) \ diff --git a/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.cpp b/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.cpp index 112c3f9ffab..98df574bfc8 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.cpp @@ -139,7 +139,7 @@ PinPropertyHandler( IoStack = IoGetCurrentIrpStackLocation(Irp); // Get the IrpTarget - IrpTarget = (IIrpTarget*)IoStack->FileObject->FsContext2; + IrpTarget = (IIrpTarget*)IoStack->FileObject->FsContext; // Get the parent Status = IrpTarget->QueryInterface(IID_IPort, (PVOID*)&Port); if (!NT_SUCCESS(Status)) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/registry.cpp b/reactos/drivers/wdm/audio/backpln/portcls/registry.cpp index de9a48d0058..96ff63ba3e8 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/registry.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/registry.cpp @@ -168,6 +168,7 @@ CRegistryKey::NewSubKey( { ZwClose(hKey); delete RegistryKey; + return Status; } *RegistrySubKey = (PREGISTRYKEY)RegistryKey; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/resource.cpp b/reactos/drivers/wdm/audio/backpln/portcls/resource.cpp index 347e8063697..f5bb925cb45 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/resource.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/resource.cpp @@ -348,6 +348,14 @@ PcNewResourceList( delete NewList; } + if (!TranslatedResourceList) + { + // + // empty resource list + // + return STATUS_SUCCESS; + } + // calculate translated resource list size ResourceCount = TranslatedResourceList->List[0].PartialResourceList.Count; #ifdef _MSC_VER @@ -371,7 +379,7 @@ PcNewResourceList( NewTranslatedResources = (PCM_RESOURCE_LIST)AllocateItem(PoolType, NewTranslatedSize, TAG_PORTCLASS); if (!NewTranslatedResources) { - FreeItem(NewList, TAG_PORTCLASS); + delete NewList; return STATUS_INSUFFICIENT_RESOURCES; } @@ -379,8 +387,7 @@ PcNewResourceList( NewUntranslatedResources = (PCM_RESOURCE_LIST)AllocateItem(PoolType, NewUntranslatedSize, TAG_PORTCLASS); if (!NewUntranslatedResources) { - FreeItem(NewList, TAG_PORTCLASS); - FreeItem(NewTranslatedResources, TAG_PORTCLASS); + delete NewList; return STATUS_INSUFFICIENT_RESOURCES; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp index 573ecb9b353..c8580955295 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp @@ -25,8 +25,8 @@ KsoGetIrpTargetFromFileObject( { PC_ASSERT(FileObject); - // IrpTarget is stored in FsContext2 - return (IIrpTarget*)FileObject->FsContext2; + // IrpTarget is stored in FsContext + return (IIrpTarget*)FileObject->FsContext; } IIrpTarget * diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c index 15a600db005..7d4756f765f 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c @@ -554,6 +554,12 @@ CompareProductName( /* read DriverDescName value */ PartialInformation = ReadKeyValue(hSubKey, &DriverDescName); + if (!PartialInformation) + { + /* failed to read driver desc key */ + return STATUS_UNSUCCESSFUL; + } + /* copy key name */ Length = min(ProductNameSize * sizeof(WCHAR), PartialInformation->DataLength); RtlMoveMemory(ProductName, (PVOID)PartialInformation->Data, Length); @@ -948,16 +954,16 @@ WdmAudWriteCompletion( IN PIRP LowerIrp, IN PVOID Context) { - PIRP Irp; + //PIRP Irp; ASSERT(LowerIrp->PendingReturned == FALSE); /* get original irp */ - Irp = (PIRP)Context; + //Irp = (PIRP)Context; /* save status */ - Irp->IoStatus.Status = LowerIrp->IoStatus.Status; - Irp->IoStatus.Information = LowerIrp->IoStatus.Information; + //Irp->IoStatus.Status = LowerIrp->IoStatus.Status; + //Irp->IoStatus.Information = LowerIrp->IoStatus.Information; /* complete request */ - IoCompleteRequest(Irp, IO_SOUND_INCREMENT); + //IoCompleteRequest(Irp, IO_SOUND_INCREMENT); /* return success to free irp */ return STATUS_SUCCESS; } @@ -1130,14 +1136,17 @@ WdmAudWrite( IoSetCompletionRoutine(LowerIrp, WdmAudWriteCompletion, (PVOID)Irp, TRUE, TRUE, TRUE); /* mark irp as pending */ - IoMarkIrpPending(Irp); - + //IoMarkIrpPending(Irp); + Irp->IoStatus.Information = DeviceInfo->BufferSize; + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + DPRINT1("Wrote %u\n", DeviceInfo->BufferSize); /* call the driver */ Status = IoCallDriver(IoGetRelatedDeviceObject(FileObject), LowerIrp); /* dereference file object */ ObDereferenceObject(FileObject); - return STATUS_PENDING; + return STATUS_SUCCESS; #endif } diff --git a/reactos/drivers/wdm/audio/sysaudio/control.c b/reactos/drivers/wdm/audio/sysaudio/control.c index 32d6ed86086..6442853fc7e 100644 --- a/reactos/drivers/wdm/audio/sysaudio/control.c +++ b/reactos/drivers/wdm/audio/sysaudio/control.c @@ -79,10 +79,10 @@ SysAudioOpenVirtualDevice( Entry = GetListEntry(&DeviceExtension->KsAudioDeviceList, DeviceNumber); ASSERT(Entry != NULL); - /* store device entry in FsContext2 + /* store device entry in FsContext * see pin.c DispatchCreateSysAudioPin for details */ - IoStack->FileObject->FsContext2 = (PVOID)Entry; + IoStack->FileObject->FsContext = (PVOID)Entry; return SetIrpIoStatus(Irp, STATUS_SUCCESS, 0); } diff --git a/reactos/drivers/wdm/audio/sysaudio/pin.c b/reactos/drivers/wdm/audio/sysaudio/pin.c index 46b00e1cd95..761c1e7ba26 100644 --- a/reactos/drivers/wdm/audio/sysaudio/pin.c +++ b/reactos/drivers/wdm/audio/sysaudio/pin.c @@ -25,8 +25,8 @@ Pin_fnDeviceIoControl( /* Get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); - /* The dispatch context is stored in the FsContext2 member */ - Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2; + /* The dispatch context is stored in the FsContext member */ + Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; /* Sanity check */ ASSERT(Context); @@ -76,8 +76,8 @@ Pin_fnRead( /* Get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); - /* The dispatch context is stored in the FsContext2 member */ - Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2; + /* The dispatch context is stored in the FsContext member */ + Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; /* Sanity check */ ASSERT(Context); @@ -136,8 +136,8 @@ Pin_fnWrite( /* Get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); - /* The dispatch context is stored in the FsContext2 member */ - Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2; + /* The dispatch context is stored in the FsContext member */ + Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; /* Sanity check */ ASSERT(Context); @@ -210,8 +210,8 @@ Pin_fnFlush( /* Get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); - /* The dispatch context is stored in the FsContext2 member */ - Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2; + /* The dispatch context is stored in the FsContext member */ + Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; /* Sanity check */ ASSERT(Context); @@ -282,8 +282,8 @@ Pin_fnClose( /* Get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); - /* The dispatch context is stored in the FsContext2 member */ - Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2; + /* The dispatch context is stored in the FsContext member */ + Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; if (Context->Handle) { @@ -379,7 +379,7 @@ Pin_fnFastWrite( DPRINT("Pin_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject); - Context = (PDISPATCH_CONTEXT)FileObject->FsContext2; + Context = (PDISPATCH_CONTEXT)FileObject->FsContext; if (Context->hMixerPin) { @@ -404,7 +404,7 @@ Pin_fnFastWrite( Status = KsStreamIo(RealFileObject, NULL, NULL, NULL, NULL, 0, IoStatus, Buffer, Length, KSSTREAM_WRITE, UserMode); - ObDereferenceObject(RealFileObject); + //ObDereferenceObject(RealFileObject); if (NT_SUCCESS(Status)) return TRUE; @@ -636,7 +636,6 @@ DispatchCreateSysAudioPin( IN PIRP Irp) { NTSTATUS Status = STATUS_SUCCESS; - KSOBJECT_HEADER ObjectHeader; PIO_STACK_LOCATION IoStack; PKSAUDIO_DEVICE_ENTRY DeviceEntry; PKSPIN_CONNECT Connect = NULL; @@ -650,10 +649,10 @@ DispatchCreateSysAudioPin( /* sanity checks */ ASSERT(IoStack->FileObject); ASSERT(IoStack->FileObject->RelatedFileObject); - ASSERT(IoStack->FileObject->RelatedFileObject->FsContext2); + ASSERT(IoStack->FileObject->RelatedFileObject->FsContext); /* get current attached virtual device */ - DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)IoStack->FileObject->RelatedFileObject->FsContext2; + DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)IoStack->FileObject->RelatedFileObject->FsContext; /* now validate pin connect request */ Status = KsValidateConnectRequest(Irp, DeviceEntry->PinDescriptorsCount, DeviceEntry->PinDescriptors, &Connect); @@ -681,7 +680,7 @@ DispatchCreateSysAudioPin( RtlZeroMemory(DispatchContext, sizeof(DISPATCH_CONTEXT)); /* allocate object header */ - Status = KsAllocateObjectHeader(&ObjectHeader, 0, NULL, Irp, &PinTable); + Status = KsAllocateObjectHeader(&DispatchContext->ObjectHeader, 0, NULL, Irp, &PinTable); if (!NT_SUCCESS(Status)) { /* failed */ @@ -696,13 +695,13 @@ DispatchCreateSysAudioPin( if (!NT_SUCCESS(Status)) { /* failed */ - KsFreeObjectHeader(ObjectHeader); + KsFreeObjectHeader(DispatchContext->ObjectHeader); ExFreePool(DispatchContext); } else { /* store dispatch context */ - IoStack->FileObject->FsContext2 = (PVOID)DispatchContext; + IoStack->FileObject->FsContext = (PVOID)DispatchContext; } diff --git a/reactos/drivers/wdm/audio/sysaudio/sysaudio.h b/reactos/drivers/wdm/audio/sysaudio/sysaudio.h index 0cf0ec17f4f..15ca8caf554 100644 --- a/reactos/drivers/wdm/audio/sysaudio/sysaudio.h +++ b/reactos/drivers/wdm/audio/sysaudio/sysaudio.h @@ -22,8 +22,8 @@ typedef struct LIST_ENTRY Entry; // device entry for KsAudioDeviceList UNICODE_STRING DeviceName; // symbolic link of audio device - HANDLE Handle; // handle to audio sub device - PFILE_OBJECT FileObject; // file objecto to audio sub device + HANDLE Handle; // handle to audio device + PFILE_OBJECT FileObject; // file objecto to audio device PIN_INFO * Pins; // array of PIN_INFO ULONG PinDescriptorsCount; // number of pin descriptors @@ -55,6 +55,7 @@ typedef struct typedef struct { + KSOBJECT_HEADER ObjectHeader; // pin object header HANDLE Handle; // audio irp pin handle ULONG PinId; // pin id of device PKSAUDIO_DEVICE_ENTRY AudioEntry; // pointer to audio device entry