[KS]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Sat, 12 Sep 2009 14:35:27 +0000 (14:35 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Sat, 12 Sep 2009 14:35:27 +0000 (14:35 +0000)
- 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

24 files changed:
reactos/drivers/ksfilter/ks/allocators.c
reactos/drivers/ksfilter/ks/api.c
reactos/drivers/ksfilter/ks/connectivity.c
reactos/drivers/ksfilter/ks/device.c
reactos/drivers/ksfilter/ks/event.c
reactos/drivers/ksfilter/ks/filter.c
reactos/drivers/ksfilter/ks/irp.c
reactos/drivers/ksfilter/ks/misc.c
reactos/drivers/ksfilter/ks/pin.c
reactos/drivers/ksfilter/ks/property.c
reactos/drivers/ksfilter/ks/topology.c
reactos/drivers/ksfilter/ks/worker.c
reactos/drivers/wdm/audio/backpln/portcls/dispatcher.cpp
reactos/drivers/wdm/audio/backpln/portcls/interrupt.cpp
reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp
reactos/drivers/wdm/audio/backpln/portcls/private.hpp
reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.cpp
reactos/drivers/wdm/audio/backpln/portcls/registry.cpp
reactos/drivers/wdm/audio/backpln/portcls/resource.cpp
reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp
reactos/drivers/wdm/audio/legacy/wdmaud/control.c
reactos/drivers/wdm/audio/sysaudio/control.c
reactos/drivers/wdm/audio/sysaudio/pin.c
reactos/drivers/wdm/audio/sysaudio/sysaudio.h

index 9880dea..6382fd7 100644 (file)
@@ -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);
index 059d7a2..7d22c40 100644 (file)
@@ -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);
index bd49380..02c36e7 100644 (file)
@@ -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:
index 82024ca..c5c5d26 100644 (file)
@@ -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)
      {
index f9231a5..eae342a 100644 (file)
@@ -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);
index edc91ac..7a8e5b2 100644 (file)
@@ -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)
     {
index 95ecb96..4d1ec7d 100644 (file)
@@ -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 */
index 14f78c0..c746602 100644 (file)
@@ -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;
 }
index 760c55f..431fb26 100644 (file)
@@ -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);
index f7cba22..5204586 100644 (file)
@@ -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;
index 2eebbfc..861413a 100644 (file)
@@ -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;
index 12835ac..4dc983c 100644 (file)
@@ -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 */
index bc01c98..8195342 100644 (file)
@@ -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);
index a957fc1..2244678 100644 (file)
@@ -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");
index b5753e0..b7a7d72 100644 (file)
@@ -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);
index 9d17365..e530f21 100644 (file)
 
 #include <dmusicks.h>
 #include <kcom.h>
-#include "stdunk.h"
 #include "interfaces.hpp"
 #include <ks.h>
 #include <ksmedia.h>
-#include <stdio.h>
-#include <math.h>
 #include <intrin.h>
 
-#include <assert.h>
-
 #define TAG_PORTCLASS 'SLCP'
 
 #define PC_ASSERT(exp) \
index 112c3f9..98df574 100644 (file)
@@ -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))
index de9a48d..96ff63b 100644 (file)
@@ -168,6 +168,7 @@ CRegistryKey::NewSubKey(
     {
         ZwClose(hKey);
         delete RegistryKey;
+        return Status;
     }
 
     *RegistrySubKey = (PREGISTRYKEY)RegistryKey;
index 347e806..f5bb925 100644 (file)
@@ -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;
     }
 
index 573ecb9..c858095 100644 (file)
@@ -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 *
index 15a600d..7d4756f 100644 (file)
@@ -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
 }
index 32d6ed8..6442853 100644 (file)
@@ -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);
 }
index 46b00e1..761c1e7 100644 (file)
@@ -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;
     }
 
 
index 0cf0ec1..15ca8ca 100644 (file)
@@ -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