[ros-diffs] [janderwald] 42143: [KS] - Rewrite KSCREATE_ITEM handling to support clocks, nodes, allocators. - Store create items in list instead of an array. Consequently, the code can be re-used for KSDEVICE_HEADER / KSOBJECT_HEADER functions. - Implement KsAddObjectCreateItemToObjectHeader - Implement now KspCreate and IKsDevice_Create properly - Implement KsGetDevice by using KSBASIC_HEADER struct which must be positioned before its object specific (PKSFILTER, PKSFILTERFACTOR, PKSPIN) - Remove a hack from KspCreateObjectType [PORTCLS] - Store real dispatched object in FsContext2 - Implement a fast device i/o handler - Increase minimum data threshold when a stream stops prematurely by 10 audio frames (port driver WaveCyclic) - Remove the hack of checking wether pin create request is passed. Since create items now work nicely, use a different function and handle pin creation requests seperately. [KMIXER] - Remove the hack of checking wether pin create request is passed. Since create items now work nicely, use a different function and handle pin creation requests seperately. [SYSAUDIO] - Remove the hack of checking wether pin create request is passed. Since create items now work nicely, use a different function and handle pin creation requests seperately.

janderwald at svn.reactos.org janderwald at svn.reactos.org
Wed Jul 22 16:42:51 CEST 2009


Author: janderwald
Date: Wed Jul 22 16:42:51 2009
New Revision: 42143

URL: http://svn.reactos.org/svn/reactos?rev=42143&view=rev
Log:
[KS]
- Rewrite KSCREATE_ITEM handling to support clocks, nodes, allocators. 
- Store create items in list instead of an array. Consequently, the code can be re-used for KSDEVICE_HEADER / KSOBJECT_HEADER functions. 
- Implement KsAddObjectCreateItemToObjectHeader
- Implement now KspCreate and IKsDevice_Create properly
- Implement KsGetDevice by using KSBASIC_HEADER struct which must be positioned before its object specific (PKSFILTER, PKSFILTERFACTOR, PKSPIN)
- Remove a hack from KspCreateObjectType
[PORTCLS]
- Store real dispatched object in FsContext2
- Implement a fast device i/o handler
- Increase minimum data threshold when a stream stops prematurely by 10 audio frames (port driver WaveCyclic)
- Remove the hack of checking wether pin create request is passed. Since create items now work nicely, use a different function and handle pin creation requests seperately.
[KMIXER]
- Remove the hack of checking wether pin create request is passed. Since create items now work nicely, use a different function and handle pin creation requests seperately.
[SYSAUDIO]
- Remove the hack of checking wether pin create request is passed. Since create items now work nicely, use a different function and handle pin creation requests seperately.



Modified:
    trunk/reactos/drivers/ksfilter/ks/allocators.c
    trunk/reactos/drivers/ksfilter/ks/api.c
    trunk/reactos/drivers/ksfilter/ks/clocks.c
    trunk/reactos/drivers/ksfilter/ks/device.c
    trunk/reactos/drivers/ksfilter/ks/driver.c
    trunk/reactos/drivers/ksfilter/ks/filter.c
    trunk/reactos/drivers/ksfilter/ks/filterfactory.c
    trunk/reactos/drivers/ksfilter/ks/irp.c
    trunk/reactos/drivers/ksfilter/ks/ksfunc.h
    trunk/reactos/drivers/ksfilter/ks/kstypes.h
    trunk/reactos/drivers/ksfilter/ks/topology.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_topology.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h
    trunk/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c
    trunk/reactos/drivers/wdm/audio/filters/kmixer/filter.c
    trunk/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h
    trunk/reactos/drivers/wdm/audio/sysaudio/control.c
    trunk/reactos/drivers/wdm/audio/sysaudio/dispatcher.c
    trunk/reactos/drivers/wdm/audio/sysaudio/pin.c
    trunk/reactos/drivers/wdm/audio/sysaudio/sysaudio.h

Modified: trunk/reactos/drivers/ksfilter/ks/allocators.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/allocators.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/allocators.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/allocators.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -550,7 +550,6 @@
     NTSTATUS Status;
     PKSALLOCATOR_FRAMING AllocatorFraming;
     PALLOCATOR Allocator;
-    PKSOBJECT_CREATE_ITEM CreateItem;
     PVOID Ctx;
 
     /* first validate connect request */
@@ -568,6 +567,7 @@
         return STATUS_INSUFFICIENT_RESOURCES;
 
     /* allocate object header */
+    
     Status = KsAllocateObjectHeader((KSOBJECT_HEADER*)&Allocator->Header, 0, NULL, Irp, &DispatchTable);
     if (!NT_SUCCESS(Status))
     {
@@ -619,16 +619,6 @@
     /* backup allocator framing */
     RtlMoveMemory(&Allocator->Status.Framing, AllocatorFraming, sizeof(KSALLOCATOR_FRAMING));
 
-    /* get create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-
-    if (CreateItem)
-    {
-        /* store create item */
-        Allocator->Header->CreateItem = CreateItem;
-        Allocator->Header->ItemCount = 1;
-    }
-
     return Status;
 }
 

Modified: trunk/reactos/drivers/ksfilter/ks/api.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/api.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/api.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/api.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -414,6 +414,65 @@
     return NULL;
 }
 
+NTSTATUS
+KspAddCreateItemToList(
+    OUT PLIST_ENTRY ListHead,
+    IN ULONG ItemsCount,
+    IN  PKSOBJECT_CREATE_ITEM ItemsList)
+{
+    ULONG Index;
+    PCREATE_ITEM_ENTRY Entry;
+
+    /* add the items */
+    for(Index = 0; Index < ItemsCount; Index++)
+    {
+        /* allocate item */
+        Entry = AllocateItem(NonPagedPool, sizeof(CREATE_ITEM_ENTRY));
+        if (!Entry)
+        {
+            /* no memory */
+            return STATUS_INSUFFICIENT_RESOURCES;
+        }
+
+        /* initialize entry */
+        InitializeListHead(&Entry->ObjectItemList);
+        Entry->CreateItem = &ItemsList[Index];
+        Entry->ReferenceCount = 0;
+        Entry->ItemFreeCallback = NULL;
+
+        InsertTailList(ListHead, &Entry->Entry);
+    }
+    return STATUS_SUCCESS;
+}
+
+VOID
+KspFreeCreateItems(
+    PLIST_ENTRY ListHead)
+{
+    PCREATE_ITEM_ENTRY Entry;
+
+    while(!IsListEmpty(ListHead))
+    {
+        /* remove create item from list */
+        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));
+
+        /* does the creator wish notification */
+        if (Entry->ItemFreeCallback)
+        {
+            /* notify creator */
+            Entry->ItemFreeCallback(Entry->CreateItem);
+        }
+
+        /* free create item entry */
+         FreeItem(Entry);
+    }
+
+}
+
 /*
     @implemented
 */
@@ -425,7 +484,7 @@
     IN  ULONG ItemsCount,
     IN  PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL)
 {
-    ULONG Index = 0;
+    NTSTATUS Status = STATUS_SUCCESS;
     PKSIDEVICE_HEADER Header;
 
     if (!OutHeader)
@@ -440,9 +499,6 @@
 
     /* clear all memory */
     RtlZeroMemory(Header, sizeof(KSIDEVICE_HEADER));
-
-    /* initialize spin lock */
-    KeInitializeSpinLock(&Header->ItemListLock); //FIXME
 
     /* initialize device mutex */
     KeInitializeMutex(&Header->DeviceMutex, 0);
@@ -452,34 +508,34 @@
     /* initialize power dispatch list */
     InitializeListHead(&Header->PowerDispatchList);
 
+    /* initialize create item list */
+    InitializeListHead(&Header->ItemList);
+
     /* are there any create items provided */
     if (ItemsCount && ItemsList)
     {
-        /* allocate space for device item list */
-        Header->ItemList = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_ITEM) * ItemsCount, TAG_DEVICE_HEADER);
-        if (!Header->ItemList)
-        {
-            ExFreePoolWithTag(Header, TAG_DEVICE_HEADER);
-            return STATUS_INSUFFICIENT_RESOURCES;
-        }
-        RtlZeroMemory(Header->ItemList, sizeof(DEVICE_ITEM) * ItemsCount);
-
-        for(Index = 0; Index < ItemsCount; Index++)
-        {
-            /* store provided create items */
-            Header->ItemList[Index].CreateItem = &ItemsList[Index];
-        }
-        Header->MaxItems = ItemsCount;
+        Status = KspAddCreateItemToList(&Header->ItemList, ItemsCount, ItemsList);
+
+        if (NT_SUCCESS(Status))
+        {
+            /* store item count */
+            Header->ItemListCount = ItemsCount;
+        }
+        else
+        {
+            /* release create items */
+            KspFreeCreateItems(&Header->ItemList);
+        }
     }
 
     /* store result */
     *OutHeader = Header;
 
-    return STATUS_SUCCESS;
-}
-
-/*
-    @unimplemented
+    return Status;
+}
+
+/*
+    @implemented
 */
 KSDDKAPI
 VOID
@@ -494,7 +550,7 @@
     if (!DevHeader)
         return;
 
-    ExFreePoolWithTag(Header->ItemList, TAG_DEVICE_HEADER);
+    KspFreeCreateItems(&Header->ItemList);
     ExFreePoolWithTag(Header, TAG_DEVICE_HEADER);
 }
 
@@ -515,6 +571,8 @@
     PDEVICE_EXTENSION DeviceExtension;
     PKSIDEVICE_HEADER DeviceHeader;
     PKSIOBJECT_HEADER ObjectHeader;
+    PKSOBJECT_CREATE_ITEM CreateItem;
+    NTSTATUS Status;
 
     if (!Header)
         return STATUS_INVALID_PARAMETER_1;
@@ -544,6 +602,12 @@
     /* initialize object header */
     RtlZeroMemory(ObjectHeader, sizeof(KSIOBJECT_HEADER));
 
+    /* initialize create item list */
+    InitializeListHead(&ObjectHeader->ItemList);
+
+    /* get create item */
+    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
     /* do we have a name */
     if (IoStack->FileObject->FileName.Buffer)
     {
@@ -560,28 +624,34 @@
 
     /* copy dispatch table */
     RtlCopyMemory(&ObjectHeader->DispatchTable, Table, sizeof(KSDISPATCH_TABLE));
+
     /* store create items */
     if (ItemsCount && ItemsList)
     {
-        ObjectHeader->ItemCount = ItemsCount;
-        ObjectHeader->CreateItem = ItemsList;
-    }
-
+        Status = KspAddCreateItemToList(&ObjectHeader->ItemList, ItemsCount, ItemsList);
+
+        if (NT_SUCCESS(Status))
+        {
+            /* store item count */
+            ObjectHeader->ItemListCount = ItemsCount;
+        }
+        else
+        {
+            /* destroy header*/
+            KsFreeObjectHeader(ObjectHeader);
+            return Status;
+        }
+    }
     /* store the object in the file object */
     ASSERT(IoStack->FileObject->FsContext == NULL);
     IoStack->FileObject->FsContext = ObjectHeader;
 
-    /* the object header is for a audio filter */
-    ASSERT(DeviceHeader->DeviceIndex < DeviceHeader->MaxItems);
-
     /* store parent device */
     ObjectHeader->ParentDeviceObject = IoGetRelatedDeviceObject(IoStack->FileObject);
 
     /* store result */
     *Header = ObjectHeader;
 
-
-
     DPRINT("KsAllocateObjectHeader ObjectClass %S FileObject %p, ObjectHeader %p\n", ObjectHeader->ObjectClass.Buffer, IoStack->FileObject, ObjectHeader);
 
     return STATUS_SUCCESS;
@@ -611,11 +681,57 @@
         ObjectHeader->Unknown->lpVtbl->Release(ObjectHeader->Unknown);
     }
 
-    /* FIXME free create items */
+    /* free create items */
+    KspFreeCreateItems(&ObjectHeader->ItemList);
 
     /* free object header */
     ExFreePoolWithTag(ObjectHeader, TAG_DEVICE_HEADER);
 
+}
+
+NTSTATUS
+KspAddObjectCreateItemToList(
+    PLIST_ENTRY ListHead,
+    IN  PDRIVER_DISPATCH Create,
+    IN  PVOID Context,
+    IN  PWCHAR ObjectClass,
+    IN  PSECURITY_DESCRIPTOR SecurityDescriptor)
+{
+   PLIST_ENTRY Entry;
+   PCREATE_ITEM_ENTRY CreateEntry;
+
+    /* point to first entry */
+    Entry = ListHead->Flink;
+
+    while(Entry != ListHead)
+    {
+        /* get create entry */
+        CreateEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
+        /* if the create item has no create routine, then it is free to use */
+        if (CreateEntry->CreateItem->Create == NULL)
+        {
+            /* sanity check */
+            ASSERT(IsListEmpty(&CreateEntry->ObjectItemList));
+            ASSERT(CreateEntry->ReferenceCount == 0);
+            /* use free entry */
+            CreateEntry->CreateItem->Context = Context;
+            CreateEntry->CreateItem->Create = Create;
+            RtlInitUnicodeString(&CreateEntry->CreateItem->ObjectClass, ObjectClass);
+            CreateEntry->CreateItem->SecurityDescriptor = SecurityDescriptor;
+
+            return STATUS_SUCCESS;
+        }
+
+        if (!wcsicmp(ObjectClass, CreateEntry->CreateItem->ObjectClass.Buffer))
+        {
+            /* the same object class already exists */
+            return STATUS_OBJECT_NAME_COLLISION;
+        }
+
+        /* iterate to next entry */
+        Entry = Entry->Flink;
+    }
+    return STATUS_ALLOTTED_SPACE_EXCEEDED;
 }
 
 /*
@@ -632,7 +748,7 @@
     IN  PSECURITY_DESCRIPTOR SecurityDescriptor)
 {
     PKSIDEVICE_HEADER Header;
-    ULONG FreeIndex, Index;
+    NTSTATUS Status;
 
     Header = (PKSIDEVICE_HEADER)DevHeader;
 
@@ -650,39 +766,16 @@
     if (!ObjectClass)
         return STATUS_INVALID_PARAMETER_4;
 
-    FreeIndex = (ULONG)-1;
-    /* now scan the list and check for a free item */
-    for(Index = 0; Index < Header->MaxItems; Index++)
-    {
-        ASSERT(Header->ItemList[Index].CreateItem);
-
-        if (Header->ItemList[Index].CreateItem->Create == NULL)
-        {
-            FreeIndex = Index;
-            break;
-        }
-
-        if (!wcsicmp(ObjectClass, Header->ItemList[Index].CreateItem->ObjectClass.Buffer))
-        {
-            /* the same object class already exists */
-            return STATUS_OBJECT_NAME_COLLISION;
-        }
-    }
-    /* found a free index */
-    if (FreeIndex == (ULONG)-1)
-    {
-        /* no empty space found */
-        return STATUS_ALLOTTED_SPACE_EXCEEDED;
-    }
-
-    /* initialize create item */
-    Header->ItemList[FreeIndex].CreateItem->Create = Create;
-    Header->ItemList[FreeIndex].CreateItem->Context = Context;
-    RtlInitUnicodeString(&Header->ItemList[FreeIndex].CreateItem->ObjectClass, ObjectClass);
-    Header->ItemList[FreeIndex].CreateItem->SecurityDescriptor = SecurityDescriptor;
-
-
-    return STATUS_SUCCESS;
+    /* let others do the work */
+    Status = KspAddObjectCreateItemToList(&Header->ItemList, Create, Context, ObjectClass, SecurityDescriptor);
+
+    if (NT_SUCCESS(Status))
+    {
+        /* increment create item count */
+        InterlockedIncrement(&Header->ItemListCount);
+    }
+
+    return Status;
 }
 
 /*
@@ -692,14 +785,41 @@
 NTSTATUS
 NTAPI
 KsAddObjectCreateItemToObjectHeader(
-    IN  KSOBJECT_HEADER Header,
+    IN  KSOBJECT_HEADER ObjectHeader,
     IN  PDRIVER_DISPATCH Create,
     IN  PVOID Context,
     IN  PWCHAR ObjectClass,
     IN  PSECURITY_DESCRIPTOR SecurityDescriptor)
 {
-    UNIMPLEMENTED;
-    return STATUS_UNSUCCESSFUL;
+    PKSIOBJECT_HEADER Header;
+    NTSTATUS Status;
+
+    Header = (PKSIOBJECT_HEADER)ObjectHeader;
+
+    DPRINT1("KsAddObjectCreateItemToDeviceHeader entered\n");
+
+     /* check if a device header has been provided */
+    if (!Header)
+        return STATUS_INVALID_PARAMETER_1;
+
+    /* check if a create item has been provided */
+    if (!Create)
+        return STATUS_INVALID_PARAMETER_2;
+
+    /* check if a object class has been provided */
+    if (!ObjectClass)
+        return STATUS_INVALID_PARAMETER_4;
+
+    /* let's work */
+    Status = KspAddObjectCreateItemToList(&Header->ItemList, Create, Context, ObjectClass, SecurityDescriptor);
+
+    if (NT_SUCCESS(Status))
+    {
+        /* increment create item count */
+        InterlockedIncrement(&Header->ItemListCount);
+    }
+
+    return Status;
 }
 
 /*
@@ -714,10 +834,9 @@
     IN  BOOLEAN AllocateEntry,
     IN  PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL)
 {
+    PCREATE_ITEM_ENTRY CreateEntry;
     PKSIDEVICE_HEADER Header;
     PKSOBJECT_CREATE_ITEM Item;
-    PDEVICE_ITEM ItemList;
-    KIRQL OldLevel;
 
     Header = (PKSIDEVICE_HEADER)DevHeader;
 
@@ -727,35 +846,25 @@
     if (!CreateItem)
         return STATUS_INVALID_PARAMETER_2;
 
-    /* acquire list lock */
-    KeAcquireSpinLock(&Header->ItemListLock, &OldLevel);
-
-    ItemList = ExAllocatePool(NonPagedPool, sizeof(DEVICE_ITEM) * (Header->MaxItems + 1));
-    if (!ItemList)
-    {
+    /* first allocate a create entry */
+    CreateEntry = AllocateItem(NonPagedPool, sizeof(PCREATE_ITEM_ENTRY));
+
+    /* check for allocation success */
+    if (!CreateEntry)
+    {
+        /* not enough resources */
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
+
     if (AllocateEntry)
     {
-        if (!ItemFreeCallback)
-        {
-            /* caller must be notified */
-            ExFreePool(ItemList);
-            /* release lock */
-            KeReleaseSpinLock(&Header->ItemListLock, OldLevel);
-
-            return STATUS_INVALID_PARAMETER_4;
-        }
         /* allocate create item */
         Item = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
         if (!Item)
         {
             /* no memory */
-            ExFreePool(ItemList);
-            /* release lock */
-            KeReleaseSpinLock(&Header->ItemListLock, OldLevel);
-
+            ExFreePool(CreateEntry);
             return STATUS_INSUFFICIENT_RESOURCES;
         }
 
@@ -772,15 +881,11 @@
         if (!Item->ObjectClass.Buffer)
         {
             /* release resources */
-            ExFreePool(Item);
-            ExFreePool(ItemList);
-
-            /* release lock */
-            KeReleaseSpinLock(&Header->ItemListLock, OldLevel);
+            FreeItem(Item);
+            FreeItem(CreateEntry);
 
             return STATUS_INSUFFICIENT_RESOURCES;
         }
-
         RtlCopyUnicodeString(&Item->ObjectClass, &CreateItem->ObjectClass);
     }
     else
@@ -788,39 +893,25 @@
         if (ItemFreeCallback)
         {
             /* callback is only accepted when the create item is copied */
-            ExFreePool(ItemList);
-            /* release lock */
-            KeReleaseSpinLock(&Header->ItemListLock, OldLevel);
-
-            return STATUS_INVALID_PARAMETER_4;
-        }
-
+            ItemFreeCallback = NULL;
+        }
+        /* use passed create item */
         Item = CreateItem;
     }
 
-
-    if (Header->MaxItems)
-    {
-        /* copy old create items */
-        RtlMoveMemory(ItemList, Header->ItemList, sizeof(DEVICE_ITEM) * Header->MaxItems);
-    }
-
-    /* initialize item entry */
-    ItemList[Header->MaxItems].CreateItem = Item;
-    ItemList[Header->MaxItems].ItemFreeCallback = ItemFreeCallback;
-
-
-    /* free old item list */
-    ExFreePool(Header->ItemList);
-
-    Header->ItemList = ItemList;
-    Header->MaxItems++;
-
-    /* release lock */
-    KeReleaseSpinLock(&Header->ItemListLock, OldLevel);
+    /* initialize create item entry */
+    InitializeListHead(&CreateEntry->ObjectItemList);
+    CreateEntry->ItemFreeCallback = ItemFreeCallback;
+    CreateEntry->CreateItem = Item;
+    CreateEntry->ReferenceCount = 0;
+
+    /* now insert the create item entry */
+    InsertTailList(&Header->ItemList, &CreateEntry->Entry);
+
+    /* increment item count */
+    InterlockedIncrement(&Header->ItemListCount);
 
     return STATUS_SUCCESS;
-
 }
 
 NTSTATUS
@@ -990,7 +1081,7 @@
         /* it is 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);
+        //DPRINT("Handled %u Status %x Length %u\n", Status, IoStatusBlock.Status, IoStatusBlock.Information);
         if (Status)
         {
             /* store bytes returned */

Modified: trunk/reactos/drivers/ksfilter/ks/clocks.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/clocks.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/clocks.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/clocks.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -159,13 +159,6 @@
     /* get create item */
     CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
 
-    if (CreateItem)
-    {
-        /* store create item */
-        Clock->ObjectHeader->CreateItem = CreateItem;
-        Clock->ObjectHeader->ItemCount = 1;
-    }
-
     return Status;
 }
 

Modified: trunk/reactos/drivers/ksfilter/ks/device.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/device.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/device.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/device.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -532,12 +532,12 @@
     IN PDEVICE_OBJECT  DeviceObject,
     IN PIRP Irp)
 {
+    PCREATE_ITEM_ENTRY CreateItemEntry;
     PIO_STACK_LOCATION IoStack;
     PDEVICE_EXTENSION DeviceExtension;
     PKSIDEVICE_HEADER DeviceHeader;
-    ULONG Index;
+    PKSIOBJECT_HEADER ObjectHeader;
     NTSTATUS Status;
-    ULONG Length;
 
     DPRINT("KS / CREATE\n");
     /* get current stack location */
@@ -553,49 +553,54 @@
     /* sanity check */
     ASSERT(IoStack->FileObject);
 
-    /* loop all device items */
-    for(Index = 0; Index < DeviceHeader->MaxItems; Index++)
-    {
-        /* is there a create item */
-        if (DeviceHeader->ItemList[Index].CreateItem == NULL)
-            continue;
-
-        /* check if the create item is initialized */
-        if (!DeviceHeader->ItemList[Index].CreateItem->Create)
-            continue;
-
-        ASSERT(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer);
-        DPRINT("CreateItem %p Request %S\n", DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer,
-                                              IoStack->FileObject->FileName.Buffer);
-
-        /* get object class length */
-        Length = wcslen(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer);
-        /* now check if the object class is the same */
-        if (!_wcsnicmp(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer, &IoStack->FileObject->FileName.Buffer[1], Length) ||
-            (DeviceHeader->ItemList[Index].CreateItem->Flags & KSCREATE_ITEM_WILDCARD))
-        {
-            /* setup create parameters */
-            DeviceHeader->DeviceIndex = Index;
-             /* set object create item */
-            KSCREATE_ITEM_IRP_STORAGE(Irp) = DeviceHeader->ItemList[Index].CreateItem;
-
-            /* call create function */
-            Status = DeviceHeader->ItemList[Index].CreateItem->Create(DeviceObject, Irp);
-
-            /* release lock */
-            IKsDevice_fnRelease((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
-
-            /* did we succeed */
-            if (NT_SUCCESS(Status))
-            {
-                /* increment create item reference count */
-                InterlockedIncrement((PLONG)&DeviceHeader->ItemList[Index].ReferenceCount);
-            }
-
-            /* return result */
-            return Status;
-        }
-    }
+    /* check if the request is relative */
+    if (IoStack->FileObject->RelatedFileObject != NULL)
+    {
+        /* request is to instantiate a pin / node / clock / allocator */
+        ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext;
+
+        /* sanity check */
+        ASSERT(ObjectHeader);
+
+        /* find a matching a create item */
+        Status = FindMatchingCreateItem(&ObjectHeader->ItemList, IoStack->FileObject->FileName.Length, IoStack->FileObject->FileName.Buffer, &CreateItemEntry);
+    }
+    else
+    {
+        /* request to create a filter */
+        Status = FindMatchingCreateItem(&DeviceHeader->ItemList, IoStack->FileObject->FileName.Length, IoStack->FileObject->FileName.Buffer, &CreateItemEntry);
+    }
+
+    if (NT_SUCCESS(Status))
+    {
+        /* set object create item */
+        KSCREATE_ITEM_IRP_STORAGE(Irp) = CreateItemEntry->CreateItem;
+
+        /* call create function */
+        Status = CreateItemEntry->CreateItem->Create(DeviceObject, Irp);
+
+        if (NT_SUCCESS(Status))
+        {
+            /* increment create item reference count */
+            InterlockedIncrement(&CreateItemEntry->ReferenceCount);
+        }
+
+        /* acquire list lock */
+        IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
+
+        return Status;
+    }
+
+    /* acquire list lock */
+    IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
+
+    DPRINT1("No item found for Request %p\n", IoStack->FileObject->FileName.Buffer);
+
+    Irp->IoStatus.Information = 0;
+    /* set return status */
+    Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return STATUS_UNSUCCESSFUL;
 
     /* release lock */
     IKsDevice_fnRelease((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
@@ -641,6 +646,7 @@
     KsSetDevicePnpAndBaseObject(Header, PhysicalDeviceObject, NextDeviceObject);
     /* initialize IKsDevice interface */
     Header->lpVtblIKsDevice = &vt_IKsDevice;
+    Header->Type = KsObjectTypeDevice;
     Header->ref = 1;
 
     /* FIXME Power state */

Modified: trunk/reactos/drivers/ksfilter/ks/driver.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/driver.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/driver.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/driver.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -37,6 +37,22 @@
     DeviceExtension = (PDEVICE_EXTENSION)FunctionalDeviceObject->DeviceExtension;
 
     return &DeviceExtension->DeviceHeader->KsDevice;
+}
+
+/*
+    @implemented
+*/
+KSDDKAPI
+PKSDEVICE
+NTAPI
+KsGetDevice(
+    IN PVOID Object)
+{
+    PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)(ULONG_PTR)Object - sizeof(KSBASIC_HEADER);
+
+    ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == BasicHeader->Type);
+
+    return BasicHeader->KsDevice;
 }
 
 /*

Modified: trunk/reactos/drivers/ksfilter/ks/filter.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/filter.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -11,13 +11,15 @@
 
 typedef struct
 {
+    KSBASIC_HEADER Header;
+    KSFILTER Filter;
+
     IKsFilterVtbl *lpVtbl;
     IKsControlVtbl *lpVtblKsControl;
     IKsFilterFactory * FilterFactory;
     LONG ref;
 
     PKSIOBJECT_HEADER ObjectHeader;
-    KSFILTER Filter;
     KSTOPOLOGY Topology;
     KSPIN_DESCRIPTOR * PinDescriptors;
     ULONG PinDescriptorCount;
@@ -831,8 +833,11 @@
     IKsFilterImpl * This;
     PKSFILTERFACTORY Factory;
     PIO_STACK_LOCATION IoStack;
+    PDEVICE_EXTENSION DeviceExtension;
     NTSTATUS Status;
 
+    /* get device extension */
+    DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
     /* get the filter factory */
     Factory = iface->lpVtbl->GetStruct(iface);
@@ -859,6 +864,8 @@
     This->Factory = Factory;
     This->FilterFactory = iface;
     This->FileObject = IoStack->FileObject;
+    This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice;
+    This->Header.Type = KsObjectTypeFilter;
 
     /* allocate the stream descriptors */
     Status = IKsFilter_CreateDescriptors(This, (PKSFILTER_DESCRIPTOR)Factory->FilterDescriptor);
@@ -908,6 +915,8 @@
     }
 
     /* initialize object header */
+    This->Header.Type = KsObjectTypeFilter;
+    This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice;
     This->ObjectHeader->Type = KsObjectTypeFilter;
     This->ObjectHeader->Unknown = (PUNKNOWN)&This->lpVtbl;
 

Modified: trunk/reactos/drivers/ksfilter/ks/filterfactory.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/filterfactory.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/filterfactory.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/filterfactory.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -11,19 +11,17 @@
 
 typedef struct
 {
+    KSBASIC_HEADER Header;
+    KSFILTERFACTORY FilterFactory;
+
     IKsFilterFactoryVtbl *lpVtbl;
-    KSFILTERFACTORY FilterFactory;
+    LONG ref;
     PKSIDEVICE_HEADER DeviceHeader;
-
-    LONG ref;
-
     PFNKSFILTERFACTORYPOWER SleepCallback;
     PFNKSFILTERFACTORYPOWER WakeCallback;
 
     LIST_ENTRY SymbolicLinkList;
     LIST_ENTRY FilterInstanceList;
-
-
 }IKsFilterFactoryImpl;
 
 typedef struct
@@ -178,10 +176,17 @@
 
     IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl);
 
+    /* get device extension */
+    DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
     /* initialize filterfactory */
     This->SleepCallback = SleepCallback;
     This->WakeCallback = WakeCallback;
     This->FilterFactory.FilterDescriptor = Descriptor;
+    This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice;
+    This->Header.Type = KsObjectTypeFilterFactory;
+    This->DeviceHeader = DeviceExtension->DeviceHeader;
+
     InitializeListHead(&This->SymbolicLinkList);
     InitializeListHead(&This->FilterInstanceList);
 
@@ -205,9 +210,6 @@
 
         FreeString = TRUE;
     }
-
-    /* get device extension */
-    DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
     /* now register the device interface */
     Status = KspRegisterDeviceInterfaces(DeviceExtension->DeviceHeader->KsDevice.PhysicalDeviceObject,

Modified: trunk/reactos/drivers/ksfilter/ks/irp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/irp.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/irp.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/irp.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -269,7 +269,7 @@
 }
 
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 NTSTATUS
@@ -903,19 +903,85 @@
     return STATUS_UNSUCCESSFUL;
 }
 
+NTSTATUS
+FindMatchingCreateItem(
+    PLIST_ENTRY ListHead,
+    ULONG BufferSize,
+    LPWSTR Buffer,
+    OUT PCREATE_ITEM_ENTRY *OutCreateItem)
+{
+    PLIST_ENTRY Entry;
+    PCREATE_ITEM_ENTRY CreateItemEntry;
+
+    /* remove '\' slash */
+    Buffer++;
+    BufferSize -= sizeof(WCHAR);
+
+    /* point to first entry */
+    Entry = ListHead->Flink;
+
+    /* loop all device items */
+    while(Entry != ListHead)
+    {
+        /* get create item entry */
+        CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
+
+        ASSERT(CreateItemEntry->CreateItem);
+
+        if(CreateItemEntry->CreateItem->Flags & KSCREATE_ITEM_WILDCARD)
+        {
+            /* create item is default */
+            *OutCreateItem = CreateItemEntry;
+            return STATUS_SUCCESS;
+        }
+
+        if (!CreateItemEntry->CreateItem->Create)
+        {
+            /* skip free create item */
+            Entry = Entry->Flink;
+            continue;
+        }
+
+        ASSERT(CreateItemEntry->CreateItem->ObjectClass.Buffer);
+
+        DPRINT1("CreateItem %S Length %u Request %S %u\n", CreateItemEntry->CreateItem->ObjectClass.Buffer,
+                                                           CreateItemEntry->CreateItem->ObjectClass.Length,
+                                                           Buffer,
+                                                           BufferSize);
+
+        if (CreateItemEntry->CreateItem->ObjectClass.Length > BufferSize)
+        {
+            /* create item doesnt match in length */
+            Entry = Entry->Flink;
+            continue;
+        }
+
+         /* now check if the object class is the same */
+        if (RtlCompareMemory(CreateItemEntry->CreateItem->ObjectClass.Buffer, Buffer, CreateItemEntry->CreateItem->ObjectClass.Length) == CreateItemEntry->CreateItem->ObjectClass.Length)
+        {
+            /* found matching create item */
+            *OutCreateItem = CreateItemEntry;
+            return STATUS_SUCCESS;
+        }
+        /* iterate to next */
+        Entry = Entry->Flink;
+    }
+
+    return STATUS_NOT_FOUND;
+}
+
 NTAPI
 NTSTATUS
 KspCreate(
     IN  PDEVICE_OBJECT DeviceObject,
     IN  PIRP Irp)
 {
+    PCREATE_ITEM_ENTRY CreateItemEntry;
     PIO_STACK_LOCATION IoStack;
     PDEVICE_EXTENSION DeviceExtension;
     PKSIDEVICE_HEADER DeviceHeader;
-    ULONG Index;
+    PKSIOBJECT_HEADER ObjectHeader;
     NTSTATUS Status;
-    KIRQL OldLevel;
-    ULONG Length;
 
     DPRINT("KS / CREATE\n");
     /* get current stack location */
@@ -925,41 +991,36 @@
     /* get device header */
     DeviceHeader = DeviceExtension->DeviceHeader;
 
-    /* acquire list lock */
-    KeAcquireSpinLock(&DeviceHeader->ItemListLock, &OldLevel);
-
-    /* sanity check */
-    ASSERT(IoStack->FileObject);
-
-    if (IoStack->FileObject->FileName.Buffer == NULL && DeviceHeader->MaxItems == 1)
+    if (IoStack->FileObject->FileName.Buffer == NULL && DeviceHeader->ItemListCount == 1)
     {
         /* hack for bug 4566 */
-        if (!DeviceHeader->ItemList[0].CreateItem || !DeviceHeader->ItemList[0].CreateItem->Create)
+        ASSERT(!IsListEmpty(&DeviceHeader->ItemList));
+        /* get create item entry */
+        CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(DeviceHeader->ItemList.Flink, CREATE_ITEM_ENTRY, Entry);
+
+        ASSERT(CreateItemEntry->CreateItem);
+
+        if (!CreateItemEntry->CreateItem->Create)
         {
             /* no valid create item */
             Irp->IoStatus.Information = 0;
             Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
             IoCompleteRequest(Irp, IO_NO_INCREMENT);
-            /* release lock */
-            KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel);
             /* return status */
             return STATUS_UNSUCCESSFUL;
         }
 
         /* set object create item */
-        KSCREATE_ITEM_IRP_STORAGE(Irp) = DeviceHeader->ItemList[0].CreateItem;
+        KSCREATE_ITEM_IRP_STORAGE(Irp) = CreateItemEntry->CreateItem;
 
         /* call create function */
-        Status = DeviceHeader->ItemList[0].CreateItem->Create(DeviceObject, Irp);
+        Status = CreateItemEntry->CreateItem->Create(DeviceObject, Irp);
 
         if (NT_SUCCESS(Status))
         {
             /* increment create item reference count */
-            InterlockedIncrement((PLONG)&DeviceHeader->ItemList[0].ReferenceCount);
-        }
-
-        /* release lock */
-        KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel);
+            InterlockedIncrement(&CreateItemEntry->ReferenceCount);
+        }
         /* return result */
         return Status;
     }
@@ -969,8 +1030,6 @@
     if (IoStack->FileObject->FileName.Buffer == NULL)
     {
         DPRINT("Using reference string hack\n");
-        /* release lock */
-        KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel);
         Irp->IoStatus.Information = 0;
         /* set return status */
         Irp->IoStatus.Status = STATUS_SUCCESS;
@@ -978,51 +1037,40 @@
         return STATUS_SUCCESS;
     }
 
-    /* loop all device items */
-    for(Index = 0; Index < DeviceHeader->MaxItems; Index++)
-    {
-        /* is there a create item */
-        if (DeviceHeader->ItemList[Index].CreateItem == NULL)
-            continue;
-
-        /* check if the create item is initialized */
-        if (!DeviceHeader->ItemList[Index].CreateItem->Create)
-            continue;
-
-        ASSERT(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer);
-        DPRINT("CreateItem %p Request %S\n", DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer,
-                                              IoStack->FileObject->FileName.Buffer);
-
-        /* get object class length */
-        Length = wcslen(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer);
-        /* now check if the object class is the same */
-        if (!_wcsnicmp(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer, &IoStack->FileObject->FileName.Buffer[1], Length) ||
-            (DeviceHeader->ItemList[Index].CreateItem->Flags & KSCREATE_ITEM_WILDCARD))
-        {
-            /* setup create parameters */
-            DeviceHeader->DeviceIndex = Index;
-             /* set object create item */
-            KSCREATE_ITEM_IRP_STORAGE(Irp) = DeviceHeader->ItemList[Index].CreateItem;
-
-            /* call create function */
-            Status = DeviceHeader->ItemList[Index].CreateItem->Create(DeviceObject, Irp);
-
-            if (NT_SUCCESS(Status))
-            {
-                /* increment create item reference count */
-                InterlockedIncrement((PLONG)&DeviceHeader->ItemList[Index].ReferenceCount);
-            }
-
-            /* release lock */
-            KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel);
-
-            /* return result */
-            return Status;
-        }
-    }
-
-    /* release lock */
-    KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel);
+
+    if (IoStack->FileObject->RelatedFileObject != NULL)
+    {
+        /* request is to instantiate a pin / node / clock / allocator */
+        ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext;
+
+        /* sanity check */
+        ASSERT(ObjectHeader);
+
+        /* find a matching a create item */
+        Status = FindMatchingCreateItem(&ObjectHeader->ItemList, IoStack->FileObject->FileName.Length, IoStack->FileObject->FileName.Buffer, &CreateItemEntry);
+    }
+    else
+    {
+        /* request to create a filter */
+        Status = FindMatchingCreateItem(&DeviceHeader->ItemList, IoStack->FileObject->FileName.Length, IoStack->FileObject->FileName.Buffer, &CreateItemEntry);
+    }
+
+    if (NT_SUCCESS(Status))
+    {
+        /* set object create item */
+        KSCREATE_ITEM_IRP_STORAGE(Irp) = CreateItemEntry->CreateItem;
+
+        /* call create function */
+        Status = CreateItemEntry->CreateItem->Create(DeviceObject, Irp);
+
+        if (NT_SUCCESS(Status))
+        {
+            /* increment create item reference count */
+            InterlockedIncrement(&CreateItemEntry->ReferenceCount);
+        }
+        return Status;
+    }
+
 
     Irp->IoStatus.Information = 0;
     /* set return status */
@@ -1031,6 +1079,81 @@
     return STATUS_UNSUCCESSFUL;
 }
 
+NTSTATUS
+RosDeviceInterfaceReferenceStringHack(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp)
+{
+    PIO_STACK_LOCATION IoStack;
+    PKSIDEVICE_HEADER DeviceHeader;
+    PDEVICE_EXTENSION DeviceExtension;
+    PCREATE_ITEM_ENTRY CreateItemEntry;
+    PLIST_ENTRY Entry;
+    LPWSTR Buffer;
+    ULONG Length;
+
+    /* get current stack location */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* get device extension */
+    DeviceExtension = (PDEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension;
+    /* get device header */
+    DeviceHeader = DeviceExtension->DeviceHeader;
+
+    /* retrieve all available reference strings registered */
+    Length = 0;
+    Entry = DeviceHeader->ItemList.Flink;
+    while(Entry != &DeviceHeader->ItemList)
+    {
+        CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
+
+        ASSERT(CreateItemEntry->CreateItem);
+        if (CreateItemEntry->CreateItem->Create && CreateItemEntry->CreateItem->ObjectClass.Buffer)
+            Length += wcslen(CreateItemEntry->CreateItem->ObjectClass.Buffer) + 1;
+
+        Entry = Entry->Flink;
+    }
+
+    /* add extra zero */
+    Length += 1;
+
+    /* allocate the buffer */
+    Buffer = ExAllocatePool(NonPagedPool, Length * sizeof(WCHAR));
+    if (!Buffer)
+    {
+        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+
+    *((LPWSTR*)Irp->UserBuffer) = Buffer;
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    Irp->IoStatus.Information = sizeof(LPWSTR);
+
+    Entry = DeviceHeader->ItemList.Flink;
+    while(Entry != &DeviceHeader->ItemList)
+    {
+        CreateItemEntry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
+
+        ASSERT(CreateItemEntry->CreateItem);
+        if (CreateItemEntry->CreateItem->Create && CreateItemEntry->CreateItem->ObjectClass.Buffer)
+        {
+            wcscpy(Buffer, CreateItemEntry->CreateItem->ObjectClass.Buffer);
+            Buffer += wcslen(Buffer) + 1;
+        }
+        Entry = Entry->Flink;
+    }
+
+
+
+    *Buffer = L'\0';
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return STATUS_SUCCESS;
+
+}
+
 NTAPI
 NTSTATUS
 KspDeviceControl(
@@ -1041,8 +1164,8 @@
     PKSIOBJECT_HEADER ObjectHeader;
     PKSIDEVICE_HEADER DeviceHeader;
     PDEVICE_EXTENSION DeviceExtension;
-    ULONG Length, Index;
-    LPWSTR Buffer;
+
+
 
     /* get current stack location */
     IoStack = IoGetCurrentIrpStackLocation(Irp);
@@ -1052,65 +1175,18 @@
     /* get device header */
     DeviceHeader = DeviceExtension->DeviceHeader;
 
-    /* hack for bug 4566 */
     if (IoStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_OBJECT_CLASS)
     {
-        /* retrieve all available reference strings registered */
-        Length = 0;
-
-        for(Index = 0; Index < DeviceHeader->MaxItems; Index++)
-        {
-            if (!DeviceHeader->ItemList[Index].CreateItem || !DeviceHeader->ItemList[Index].CreateItem->Create || !DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer)
-                continue;
-
-            Length += wcslen(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer) + 1;
-        }
-
-        /* add extra zero */
-        Length += 1;
-
-        /* allocate the buffer */
-        Buffer = ExAllocatePool(NonPagedPool, Length * sizeof(WCHAR));
-        if (!Buffer)
-        {
-            Irp->IoStatus.Information = 0;
-            Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
-            IoCompleteRequest(Irp, IO_NO_INCREMENT);
-            return STATUS_INSUFFICIENT_RESOURCES;
-        }
-
-        *((LPWSTR*)Irp->UserBuffer) = Buffer;
-        Irp->IoStatus.Status = STATUS_SUCCESS;
-        Irp->IoStatus.Information = sizeof(LPWSTR);
-
-        for(Index = 0; Index < DeviceHeader->MaxItems; Index++)
-        {
-            if (!DeviceHeader->ItemList[Index].CreateItem || !DeviceHeader->ItemList[Index].CreateItem->Create || !DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer)
-                continue;
-
-            wcscpy(Buffer, DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer);
-            Buffer += wcslen(Buffer) + 1;
-        }
-        *Buffer = L'\0';
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-        return STATUS_SUCCESS;
-    }
-
-    DPRINT("KS / DeviceControl\n");
-    if (IoStack->FileObject && IoStack->FileObject->FsContext)
-    {
-        ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
-
-        KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
-
-        return ObjectHeader->DispatchTable.DeviceIoControl(DeviceObject, Irp);
-    }
-    else
-    {
-        DPRINT1("Expected Object Header\n");
-        KeBugCheckEx(0, 0, 0, 0, 0);
-        return STATUS_SUCCESS;
-    }
+        /* hack for bug 4566 */
+        return RosDeviceInterfaceReferenceStringHack(DeviceObject, Irp);
+    }
+
+    ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
+
+    ASSERT(ObjectHeader);
+    //KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
+
+    return ObjectHeader->DispatchTable.DeviceIoControl(DeviceObject, Irp);
 }
 
 NTAPI
@@ -1150,7 +1226,7 @@
     /* sanity check */
     ASSERT(ObjectHeader);
     /* store create item */
-    KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem;
+    //KSCREATE_ITEM_IRP_STORAGE(Irp) = (PKSOBJECT_CREATE_ITEM)0x12345678; //ObjectHeader->CreateItem;
 
     /* retrieve matching dispatch function */
     switch(IoStack->MajorFunction)

Modified: trunk/reactos/drivers/ksfilter/ks/ksfunc.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/ksfunc.h?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/ksfunc.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/ksfunc.h [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -2,6 +2,7 @@
 #define KSFUNC_H__
 
 #include "ksiface.h"
+#include "kstypes.h"
 
 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
 #define TAG_KSDEVICE TAG('K', 'S', 'E', 'D')
@@ -99,4 +100,11 @@
     IN PKSIDENTIFIER  Request,
     IN OUT PVOID  Data);
 
+NTSTATUS
+FindMatchingCreateItem(
+    PLIST_ENTRY ListHead,
+    ULONG BufferSize,
+    LPWSTR Buffer,
+    OUT PCREATE_ITEM_ENTRY *OutCreateItem);
+
 #endif

Modified: trunk/reactos/drivers/ksfilter/ks/kstypes.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/kstypes.h?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/kstypes.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/kstypes.h [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -5,8 +5,9 @@
 {
     KSDISPATCH_TABLE DispatchTable;
     KSOBJECTTYPE Type;
-    ULONG ItemCount;
-    PKSOBJECT_CREATE_ITEM CreateItem;
+
+    LONG ItemListCount;
+    LIST_ENTRY ItemList;
 
     UNICODE_STRING ObjectClass;
     PUNKNOWN Unknown;
@@ -24,32 +25,38 @@
 
 typedef struct
 {
+    LIST_ENTRY Entry;
     PKSOBJECT_CREATE_ITEM CreateItem;
     PFNKSITEMFREECALLBACK ItemFreeCallback;
     LONG ReferenceCount;
-}DEVICE_ITEM, *PDEVICE_ITEM;
-
-
+    LIST_ENTRY ObjectItemList;
+}CREATE_ITEM_ENTRY, *PCREATE_ITEM_ENTRY;
 
 typedef struct
 {
+    KSOBJECTTYPE Type;
+    PKSDEVICE KsDevice;
+}KSBASIC_HEADER, *PKSBASIC_HEADER;
+
+typedef struct
+{
+    KSOBJECTTYPE Type;
+    KSDEVICE KsDevice;
     IKsDeviceVtbl *lpVtblIKsDevice;
+
     LONG ref;
     ERESOURCE SecurityLock;
 
-    USHORT MaxItems;
-    DEVICE_ITEM *ItemList;
+    LONG ItemListCount;
+    LIST_ENTRY ItemList;
 
     ULONG DeviceIndex;
-    KSPIN_LOCK ItemListLock;
-
     PDEVICE_OBJECT PnpDeviceObject;
     PDEVICE_OBJECT BaseDevice;
 
     KSTARGET_STATE TargetState;
     LIST_ENTRY TargetDeviceList;
 
-    KSDEVICE KsDevice;
     KMUTEX DeviceMutex;
     KSDEVICE_DESCRIPTOR* Descriptor;
 

Modified: trunk/reactos/drivers/ksfilter/ks/topology.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/topology.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/topology.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/topology.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -23,29 +23,11 @@
     NTSTATUS Status;
     IO_STATUS_BLOCK IoStatusBlock;
     OBJECT_ATTRIBUTES ObjectAttributes;
-    PFILE_OBJECT FileObject;
     UNICODE_STRING Name;
-    PKSIOBJECT_HEADER ObjectHeader;
-
-    /* acquire parent file object */
-    Status = ObReferenceObjectByHandle(ParentHandle,
-                                       GENERIC_READ | GENERIC_WRITE, 
-                                       IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
-
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT("Failed to reference parent %x\n", Status);
-        return Status;
-    }
-
-    /* get parent object header */
-    ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
-    /* sanity check */
-    ASSERT(ObjectHeader);
 
     /* calculate request length */
     Name.Length = 0;
-    Name.MaximumLength = wcslen(ObjectType) * sizeof(WCHAR) + CreateParametersSize + ObjectHeader->ObjectClass.MaximumLength + 2 * sizeof(WCHAR);
+    Name.MaximumLength = wcslen(ObjectType) * sizeof(WCHAR) + CreateParametersSize +  2 * sizeof(WCHAR);
     Name.MaximumLength += sizeof(WCHAR);
     /* acquire request buffer */
     Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength);
@@ -53,16 +35,13 @@
     if (!Name.Buffer)
     {
         /* insufficient resources */
-        ObDereferenceObject(FileObject);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
-    /* build a request which looks like \Parent\{ObjectGuid}\CreateParameters 
+    /* build a request which looks like \{ObjectClass}\CreateParameters 
      * For pins the parent is the reference string used in registration
      * For clocks it is full path for pin\{ClockGuid}\ClockCreateParams
      */
-    
-    RtlAppendUnicodeStringToString(&Name, &ObjectHeader->ObjectClass);
     RtlAppendUnicodeToString(&Name, L"\\");
     RtlAppendUnicodeToString(&Name, ObjectType);
     RtlAppendUnicodeToString(&Name, L"\\");
@@ -81,7 +60,7 @@
                           0,
                           0,
                           FILE_OPEN,
-                          FILE_SYNCHRONOUS_IO_NONALERT,
+                          0,
                           NULL,
                           0,
                           CreateFileTypeNone,
@@ -90,8 +69,6 @@
 
     /* free request buffer */
     ExFreePool(Name.Buffer);
-    /* release parent handle */
-    ObDereferenceObject(FileObject);
     return Status;
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -183,7 +183,7 @@
     if (PrevDeviceObject)
     {
         /* store the device object in the device header */
-        //KsSetDevicePnpBaseObject(portcls_ext->KsDeviceHeader, PrevDeviceObject, fdo);
+        //KsSetDevicePnpBaseObject(portcls_ext->KsDeviceHeader, fdo, PrevDeviceObject);
         portcls_ext->PrevDeviceObject = PrevDeviceObject;
     }
     else

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -15,13 +15,15 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-    /* get the IrpTarget */
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    PIO_STACK_LOCATION IoStack;
+    IIrpTarget * IrpTarget;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* access IrpTarget */
+    IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
     /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->DeviceIoControl(IrpTarget, DeviceObject, Irp);
 }
@@ -32,13 +34,16 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-    /* get the IrpTarget */
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    PIO_STACK_LOCATION IoStack;
+    IIrpTarget * IrpTarget;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* access IrpTarget */
+    IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
     /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->Read(IrpTarget, DeviceObject, Irp);
 }
@@ -49,13 +54,16 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-    /* get the IrpTarget */
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    PIO_STACK_LOCATION IoStack;
+    IIrpTarget * IrpTarget;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* access IrpTarget */
+    IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
     /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->Write(IrpTarget, DeviceObject, Irp);
 }
@@ -66,13 +74,16 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-    /* get the IrpTarget */
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    PIO_STACK_LOCATION IoStack;
+    IIrpTarget * IrpTarget;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* access IrpTarget */
+    IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
     /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->Flush(IrpTarget, DeviceObject, Irp);
 }
@@ -83,13 +94,16 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-    /* get the IrpTarget */
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    PIO_STACK_LOCATION IoStack;
+    IIrpTarget * IrpTarget;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* access IrpTarget */
+    IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
     /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->Close(IrpTarget, DeviceObject, Irp);
 }
@@ -100,13 +114,16 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-    /* get the IrpTarget */
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    PIO_STACK_LOCATION IoStack;
+    IIrpTarget * IrpTarget;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* access IrpTarget */
+    IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
     /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->QuerySecurity(IrpTarget, DeviceObject, Irp);
 }
@@ -117,13 +134,16 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    IIrpTarget * IrpTarget;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-
-    /* access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-    /* get the IrpTarget */
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    PIO_STACK_LOCATION IoStack;
+    IIrpTarget * IrpTarget;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* access IrpTarget */
+    IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
+
+
     /* let IrpTarget handle request */
     return IrpTarget->lpVtbl->SetSecurity(IrpTarget, DeviceObject, Irp);
 }
@@ -212,26 +232,19 @@
 NewDispatchObject(
     IN PIRP Irp,
     IN IIrpTarget * Target,
-    IN LPWSTR Name)
+    IN ULONG CreateItemCount,
+    IN PKSOBJECT_CREATE_ITEM CreateItem)
 {
     NTSTATUS Status;
     KSOBJECT_HEADER ObjectHeader;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-    PIO_STACK_LOCATION IoStack;
-
-    CreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM), TAG_PORTCLASS);
-    if (!CreateItem)
-        return STATUS_INSUFFICIENT_RESOURCES;
-
-    CreateItem->Context = (PVOID)Target;
-    RtlInitUnicodeString(&CreateItem->ObjectClass, Name);
-
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    ASSERT(IoStack->FileObject);
+    PIO_STACK_LOCATION IoStack;
+
+    /* get current irp stack location */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
 
     IoStack->FileObject->FsContext2 = (PVOID)Target;
 
-    Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
+    Status = KsAllocateObjectHeader(&ObjectHeader, CreateItemCount, CreateItem, Irp, &DispatchTable);
     DPRINT("KsAllocateObjectHeader result %x\n", Status);
     return Status;
 }

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_topology.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_topology.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_topology.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_topology.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -242,7 +242,43 @@
     OUT PIO_STATUS_BLOCK StatusBlock,
     IN PDEVICE_OBJECT DeviceObject)
 {
-    return FALSE;
+    ULONG Index;
+    PKSPROPERTY Property;
+    NTSTATUS Status;
+    ISubdevice * SubDevice = NULL;
+    PSUBDEVICE_DESCRIPTOR Descriptor = NULL;
+    IPortFilterTopologyImpl * This = (IPortFilterTopologyImpl*)iface;
+
+    Property = (PKSPROPERTY)InputBuffer;
+
+    if (InputBufferLength < sizeof(KSPROPERTY))
+        return FALSE;
+
+
+    /* get private interface */
+    Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&SubDevice);
+    if (!NT_SUCCESS(Status))
+        return FALSE;
+
+    /* get descriptor */
+    Status = SubDevice->lpVtbl->GetDescriptor(SubDevice, &Descriptor);
+    if (!NT_SUCCESS(Status))
+    {
+        SubDevice->lpVtbl->Release(SubDevice);
+        return FALSE;
+    }
+
+    for(Index = 0; Index < Descriptor->FilterPropertySet.FreeKsPropertySetOffset; Index++)
+    {
+        if (IsEqualGUIDAligned(&Property->Set, Descriptor->FilterPropertySet.Properties[Index].Set))
+        {
+            FastPropertyHandler(FileObject, (PKSPROPERTY)InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, StatusBlock,
+                                1,
+                                &Descriptor->FilterPropertySet.Properties[Index],
+                                Descriptor, SubDevice);
+        }
+    }
+    return TRUE;
 }
 
 /*

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -1015,7 +1015,7 @@
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 NTAPI

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -260,7 +260,7 @@
             /* get maximum data threshold */
             MaximumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec;
             /* increase minimum data threshold by a third sec */
-            MinimumDataThreshold += ((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec / 3;
+            MinimumDataThreshold += This->FrameSize * 10;
 
             /* assure it has not exceeded */
             MinimumDataThreshold = min(MinimumDataThreshold, MaximumDataThreshold);
@@ -970,7 +970,7 @@
     PrePostRatio = (This->PreCompleted * 100) / This->TotalPackets;
     MinData = This->IrpQueue->lpVtbl->NumData(This->IrpQueue);
 
-    DPRINT1("IPortPinWaveCyclic_fnFastWrite entered Total %u Pre %u Post %u State %x MinData %u Ratio %u\n", This->TotalPackets, This->PreCompleted, This->PostCompleted, This->State, This->IrpQueue->lpVtbl->NumData(This->IrpQueue), PrePostRatio);
+    DPRINT("IPortPinWaveCyclic_fnFastWrite entered Total %u Pre %u Post %u State %x MinData %u Ratio %u\n", This->TotalPackets, This->PreCompleted, This->PostCompleted, This->State, This->IrpQueue->lpVtbl->NumData(This->IrpQueue), PrePostRatio);
 
     Packet = (PCONTEXT_WRITE)Buffer;
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -249,9 +249,9 @@
             /* get current data threshold */
             MinimumDataThreshold = This->IrpQueue->lpVtbl->GetMinimumDataThreshold(This->IrpQueue);
             /* get maximum data threshold */
-            MaximumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec * 3;
-            /* increase minimum data threshold by a third sec */
-            MinimumDataThreshold += ((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec / 3;
+            MaximumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)This->Format)->WaveFormatEx.nAvgBytesPerSec;
+            /* increase minimum data threshold by 10 frames */
+            MinimumDataThreshold += This->AllocatorFraming.FrameSize * 10;
 
             /* assure it has not exceeded */
             MinimumDataThreshold = min(MinimumDataThreshold, MaximumDataThreshold);
@@ -432,48 +432,48 @@
 NTAPI
 IPortPinWavePci_HandleKsProperty(
     IN IPortPinWavePci * iface,
-    IN PIRP Irp)
+    IN PVOID InputBuffer,
+    IN ULONG InputBufferLength,
+    IN PVOID OutputBuffer,
+    IN ULONG OutputBufferLength,
+    IN PIO_STATUS_BLOCK IoStatusBlock)
 {
     PKSPROPERTY Property;
     NTSTATUS Status;
     UNICODE_STRING GuidString;
-    PIO_STACK_LOCATION IoStack;
 
     IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)iface;
 
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
 
     DPRINT("IPortPinWavePci_HandleKsProperty entered\n");
 
-    if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSPROPERTY))
-    {
-        Irp->IoStatus.Information = 0;
-        Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    if (InputBufferLength < sizeof(KSPROPERTY))
+    {
+        IoStatusBlock->Information = 0;
+        IoStatusBlock->Status = STATUS_INVALID_PARAMETER;
         return STATUS_INVALID_PARAMETER;
     }
 
-    Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
+    Property = (PKSPROPERTY)InputBuffer;
 
     if (IsEqualGUIDAligned(&Property->Set, &KSPROPSETID_Connection))
     {
         if (Property->Id == KSPROPERTY_CONNECTION_STATE)
         {
-            PKSSTATE State = (PKSSTATE)Irp->UserBuffer;
+            PKSSTATE State = (PKSSTATE)OutputBuffer;
 
             ASSERT_IRQL(DISPATCH_LEVEL);
-            if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSSTATE))
+            if (OutputBufferLength < sizeof(KSSTATE))
             {
-                Irp->IoStatus.Information = sizeof(KSSTATE);
-                Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
-                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                IoStatusBlock->Information = sizeof(KSSTATE);
+                IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL;
                 return STATUS_BUFFER_TOO_SMALL;
             }
 
             if (Property->Flags & KSPROPERTY_TYPE_SET)
             {
                 Status = STATUS_UNSUCCESSFUL;
-                Irp->IoStatus.Information = 0;
+                IoStatusBlock->Information = 0;
 
                 if (This->Stream)
                 {
@@ -485,39 +485,35 @@
                         This->State = *State;
                     }
                 }
-                Irp->IoStatus.Status = Status;
-                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                IoStatusBlock->Status = Status;
                 return Status;
             }
             else if (Property->Flags & KSPROPERTY_TYPE_GET)
             {
                 *State = This->State;
-                Irp->IoStatus.Information = sizeof(KSSTATE);
-                Irp->IoStatus.Status = STATUS_SUCCESS;
-                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                IoStatusBlock->Information = sizeof(KSSTATE);
+                IoStatusBlock->Status = STATUS_SUCCESS;
                 return STATUS_SUCCESS;
             }
         }
         else if (Property->Id == KSPROPERTY_CONNECTION_DATAFORMAT)
         {
-            PKSDATAFORMAT DataFormat = (PKSDATAFORMAT)Irp->UserBuffer;
+            PKSDATAFORMAT DataFormat = (PKSDATAFORMAT)OutputBuffer;
             if (Property->Flags & KSPROPERTY_TYPE_SET)
             {
                 PKSDATAFORMAT NewDataFormat;
                 if (!RtlCompareMemory(DataFormat, This->Format, DataFormat->FormatSize))
                 {
-                    Irp->IoStatus.Information = DataFormat->FormatSize;
-                    Irp->IoStatus.Status = STATUS_SUCCESS;
-                    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                    IoStatusBlock->Information = DataFormat->FormatSize;
+                    IoStatusBlock->Status = STATUS_SUCCESS;
                     return STATUS_SUCCESS;
                 }
 
                 NewDataFormat = AllocateItem(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS);
                 if (!NewDataFormat)
                 {
-                    Irp->IoStatus.Information = 0;
-                    Irp->IoStatus.Status = STATUS_NO_MEMORY;
-                    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                    IoStatusBlock->Information = 0;
+                    IoStatusBlock->Status = STATUS_NO_MEMORY;
                     return STATUS_NO_MEMORY;
                 }
                 RtlMoveMemory(NewDataFormat, DataFormat, DataFormat->FormatSize);
@@ -543,16 +539,14 @@
 
                         This->IrpQueue->lpVtbl->UpdateFormat(This->IrpQueue, (PKSDATAFORMAT)NewDataFormat);
                         This->Format = NewDataFormat;
-                        Irp->IoStatus.Information = DataFormat->FormatSize;
-                        Irp->IoStatus.Status = STATUS_SUCCESS;
-                        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                        IoStatusBlock->Information = DataFormat->FormatSize;
+                        IoStatusBlock->Status = STATUS_SUCCESS;
                         return STATUS_SUCCESS;
                     }
                 }
                 DPRINT1("Failed to set format\n");
-                Irp->IoStatus.Information = 0;
-                Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
-                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                IoStatusBlock->Information = 0;
+                IoStatusBlock->Status = STATUS_UNSUCCESSFUL;
                 return STATUS_UNSUCCESSFUL;
             }
             else if (Property->Flags & KSPROPERTY_TYPE_GET)
@@ -560,45 +554,40 @@
                 if (!This->Format)
                 {
                     DPRINT1("No format\n");
-                    Irp->IoStatus.Information = 0;
-                    Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
-                    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                    IoStatusBlock->Information = 0;
+                    IoStatusBlock->Status = STATUS_UNSUCCESSFUL;
                     return STATUS_UNSUCCESSFUL;
                 }
-                if (This->Format->FormatSize > IoStack->Parameters.DeviceIoControl.OutputBufferLength)
+                if (This->Format->FormatSize > OutputBufferLength)
                 {
-                    Irp->IoStatus.Information = This->Format->FormatSize;
-                    Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
-                    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                    IoStatusBlock->Information = This->Format->FormatSize;
+                    IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL;
                     return STATUS_BUFFER_TOO_SMALL;
                 }
 
                 RtlMoveMemory(DataFormat, This->Format, This->Format->FormatSize);
-                Irp->IoStatus.Information = DataFormat->FormatSize;
-                Irp->IoStatus.Status = STATUS_SUCCESS;
-                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                IoStatusBlock->Information = DataFormat->FormatSize;
+                IoStatusBlock->Status = STATUS_SUCCESS;
                 return STATUS_SUCCESS;
             }
         }
         else if (Property->Id == KSPROPERTY_CONNECTION_ALLOCATORFRAMING)
         {
-            PKSALLOCATOR_FRAMING Framing = (PKSALLOCATOR_FRAMING)Irp->UserBuffer;
+            PKSALLOCATOR_FRAMING Framing = (PKSALLOCATOR_FRAMING)OutputBuffer;
 
             ASSERT_IRQL(DISPATCH_LEVEL);
             /* Validate input buffer */
-            if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSALLOCATOR_FRAMING))
+            if (OutputBufferLength < sizeof(KSALLOCATOR_FRAMING))
             {
-                Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
-                Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
-                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                IoStatusBlock->Information = sizeof(KSALLOCATOR_FRAMING);
+                IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL;
                 return STATUS_BUFFER_TOO_SMALL;
             }
             /* copy frame allocator struct */
             RtlMoveMemory(Framing, &This->AllocatorFraming, sizeof(KSALLOCATOR_FRAMING));
 
-            Irp->IoStatus.Information = sizeof(KSALLOCATOR_FRAMING);
-            Irp->IoStatus.Status = STATUS_SUCCESS;
-            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+            IoStatusBlock->Information = sizeof(KSALLOCATOR_FRAMING);
+            IoStatusBlock->Status = STATUS_SUCCESS;
             return STATUS_SUCCESS;
         }
     }
@@ -607,9 +596,8 @@
     DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
     RtlFreeUnicodeString(&GuidString);
 
-    Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
-    Irp->IoStatus.Information = 0;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    IoStatusBlock->Status = STATUS_NOT_IMPLEMENTED;
+    IoStatusBlock->Information = 0;
     return STATUS_NOT_IMPLEMENTED;
 }
 
@@ -624,12 +612,15 @@
     IN PIRP Irp)
 {
     PIO_STACK_LOCATION IoStack;
+    NTSTATUS Status;
 
     IoStack = IoGetCurrentIrpStackLocation(Irp);
 
     if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
     {
-       return IPortPinWavePci_HandleKsProperty(iface, Irp);
+       Status = IPortPinWavePci_HandleKsProperty(iface, IoStack->Parameters.DeviceIoControl.Type3InputBuffer, IoStack->Parameters.DeviceIoControl.InputBufferLength, Irp->UserBuffer, IoStack->Parameters.DeviceIoControl.OutputBufferLength, &Irp->IoStatus);
+       IoCompleteRequest(Irp, IO_NO_INCREMENT);
+       return Status;
     }
 
 
@@ -850,7 +841,17 @@
     OUT PIO_STATUS_BLOCK StatusBlock,
     IN PDEVICE_OBJECT DeviceObject)
 {
-    UNIMPLEMENTED
+    NTSTATUS Status;
+
+    if (IoControlCode == IOCTL_KS_PROPERTY)
+    {
+       Status = IPortPinWavePci_HandleKsProperty(iface, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, StatusBlock);
+       if (NT_SUCCESS(Status))
+       {
+           return TRUE;
+       }
+    }
+
     return FALSE;
 }
 
@@ -917,6 +918,7 @@
     NTSTATUS Status;
     PCONTEXT_WRITE Packet;
     PIRP Irp;
+    ULONG MinimumDataThreshold;
     IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)iface;
 
     DPRINT("IPortPinWavePci_fnFastWrite entered Total %u Pre %u Post %u\n", This->TotalPackets, This->PreCompleted, This->PostCompleted);
@@ -955,9 +957,15 @@
 
     if (This->IrpQueue->lpVtbl->HasLastMappingFailed(This->IrpQueue))
     {
-        /* notify port driver that new mapping is available */
-        DPRINT("Notifying of new mapping\n");
-        This->Stream->lpVtbl->MappingAvailable(This->Stream);
+        /* get minimum data threshold */
+        MinimumDataThreshold = This->IrpQueue->lpVtbl->GetMinimumDataThreshold(This->IrpQueue);
+
+        if (MinimumDataThreshold < This->IrpQueue->lpVtbl->NumData(This->IrpQueue))
+        {
+            /* notify port driver that new mapping is available */
+            DPRINT("Notifying of new mapping\n");
+            This->Stream->lpVtbl->MappingAvailable(This->Stream);
+        }
     }
 
     return TRUE;

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -515,12 +515,13 @@
                                                          WorkerContext->Irp,
                                                          NULL);
 
-    DPRINT("CreatePinWorkerRoutine Status %x\n", Status);
+    DPRINT1("CreatePinWorkerRoutine Status %x\n", Status);
 
     if (NT_SUCCESS(Status))
     {
         /* create the dispatch object */
-        Status = NewDispatchObject(WorkerContext->Irp, Pin, NULL);
+        /* FIXME need create item for clock */
+        Status = NewDispatchObject(WorkerContext->Irp, Pin, 0, NULL);
         DPRINT("Pin %p\n", Pin);
     }
 
@@ -536,6 +537,78 @@
     FreeItem(WorkerContext, TAG_PORTCLASS);
 }
 
+NTSTATUS
+NTAPI
+PcCreatePinDispatch(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp)
+{
+    IIrpTarget *Filter;
+    PKSOBJECT_CREATE_ITEM CreateItem;
+    PPIN_WORKER_CONTEXT Context;
+
+    /* access the create item */
+    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+    /* sanity check */
+    ASSERT(CreateItem);
+
+    DPRINT1("PcCreatePinDispatch called DeviceObject %p %S Name\n", DeviceObject, CreateItem->ObjectClass.Buffer);
+
+    Filter = (IIrpTarget*)CreateItem->Context;
+
+    /* sanity checks */
+    ASSERT(Filter != NULL);
+
+
+#if KS_IMPLEMENTED
+    Status = KsReferenceSoftwareBusObject(DeviceExt->KsDeviceHeader);
+    if (!NT_SUCCESS(Status) && Status != STATUS_NOT_IMPLEMENTED)
+    {
+        DPRINT1("PcCreatePinDispatch failed to reference device header\n");
+
+        FreeItem(Entry, TAG_PORTCLASS);
+        goto cleanup;
+    }
+#endif
+
+     /* new pins are instantiated at passive level,
+      * so allocate a work item and context for it 
+      */
+
+     Context = AllocateItem(NonPagedPool, sizeof(PIN_WORKER_CONTEXT), TAG_PORTCLASS);
+     if (!Context)
+     {
+         DPRINT("Failed to allocate worker context\n");
+         Irp->IoStatus.Information = 0;
+         Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+         IoCompleteRequest(Irp, IO_NO_INCREMENT);
+         return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    /* allocate work item */
+    Context->WorkItem = IoAllocateWorkItem(DeviceObject);
+    if (!Context->WorkItem)
+    {
+        DPRINT("Failed to allocate workitem\n");
+        FreeItem(Context, TAG_PORTCLASS);
+        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    Context->Filter = Filter;
+    Context->Irp = Irp;
+
+    DPRINT("Queueing IRP %p Irql %u\n", Irp, KeGetCurrentIrql());
+    Irp->IoStatus.Information = 0;
+    Irp->IoStatus.Status = STATUS_PENDING;
+    IoMarkIrpPending(Irp);
+    IoQueueWorkItem(Context->WorkItem, CreatePinWorkerRoutine, DelayedWorkQueue, (PVOID)Context);
+    return STATUS_PENDING;
+}
+
+
 
 NTSTATUS
 NTAPI
@@ -543,59 +616,34 @@
     IN  PDEVICE_OBJECT DeviceObject,
     IN  PIRP Irp)
 {
-    NTSTATUS Status = STATUS_SUCCESS;
-    PIO_STACK_LOCATION IoStack;
+    NTSTATUS Status;
     ISubdevice * SubDevice;
-    PPCLASS_DEVICE_EXTENSION DeviceExt;
     IIrpTarget *Filter;
-    PKSOBJECT_CREATE_ITEM CreateItem;
-    PPIN_WORKER_CONTEXT Context;
-    LPWSTR Buffer;
+    PKSOBJECT_CREATE_ITEM CreateItem, PinCreateItem;
+
     static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}";
-
-    DPRINT1("PcCreateItemDispatch called DeviceObject %p\n", DeviceObject);
 
     /* access the create item */
     CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
-    if (!CreateItem)
-    {
-        DPRINT1("PcCreateItemDispatch no CreateItem\n");
-        return STATUS_UNSUCCESSFUL;
-    }
-
+
+    DPRINT1("PcCreateItemDispatch called DeviceObject %p %S Name\n", DeviceObject, CreateItem->ObjectClass.Buffer);
+
+    /* get the subdevice */
     SubDevice = (ISubdevice*)CreateItem->Context;
-    DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    if (!SubDevice || !DeviceExt)
-    {
-        DPRINT1("PcCreateItemDispatch SubDevice %p DeviceExt %p\n", SubDevice, DeviceExt);
-        return STATUS_UNSUCCESSFUL;
-    }
+
+    /* sanity checks */
+    ASSERT(SubDevice != NULL);
 
 #if KS_IMPLEMENTED
     Status = KsReferenceSoftwareBusObject(DeviceExt->KsDeviceHeader);
     if (!NT_SUCCESS(Status) && Status != STATUS_NOT_IMPLEMENTED)
     {
-        DPRINT1("PciCreateItemDispatch failed to reference device header\n");
+        DPRINT1("PcCreateItemDispatch failed to reference device header\n");
 
         FreeItem(Entry, TAG_PORTCLASS);
         goto cleanup;
     }
 #endif
-
-
-    /* get current io stack location */
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    /* sanity check */
-    ASSERT(IoStack->FileObject != NULL);
-
-    if (IoStack->FileObject->FsContext != NULL)
-    {
-        /* nothing to do */
-        DPRINT1("FsContext already exists\n");
-        return STATUS_SUCCESS;
-    }
-
 
     /* get filter object 
      * is implemented as a singleton
@@ -611,61 +659,36 @@
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Failed to get filter object\n");
-        return Status;
-    }
-
-    /* get the buffer */
-    Buffer = IoStack->FileObject->FileName.Buffer;
-
-    /* check if the request contains a pin request */
-    if (!wcsstr(Buffer, KS_NAME_PIN))
-    {
-        /* creator just wants the filter object */
-        Status = NewDispatchObject(Irp, Filter, CreateItem->ObjectClass.Buffer);
-
-        DPRINT1("Filter %p\n", Filter);
-        Irp->IoStatus.Information = 0;
         Irp->IoStatus.Status = Status;
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
         return Status;
     }
-    else
-    {
-        /* try to create new pin */
-        Context = AllocateItem(NonPagedPool, sizeof(PIN_WORKER_CONTEXT), TAG_PORTCLASS);
-        if (!Context)
-        {
-            DPRINT("Failed to allocate worker context\n");
-            Irp->IoStatus.Information = 0;
-            Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
-            IoCompleteRequest(Irp, IO_NO_INCREMENT);
-            return STATUS_INSUFFICIENT_RESOURCES;
-        }
-        /* allocate work item */
-        Context->WorkItem = IoAllocateWorkItem(DeviceObject);
-        if (!Context->WorkItem)
-        {
-            DPRINT("Failed to allocate workitem\n");
-            FreeItem(Context, TAG_PORTCLASS);
-            Irp->IoStatus.Information = 0;
-            Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
-            IoCompleteRequest(Irp, IO_NO_INCREMENT);
-            return STATUS_INSUFFICIENT_RESOURCES;
-        }
-
-        Context->Filter = Filter;
-        Context->Irp = Irp;
-
-        DPRINT("Queueing IRP %p Irql %u\n", Irp, KeGetCurrentIrql());
-        Irp->IoStatus.Information = 0;
-        Irp->IoStatus.Status = STATUS_PENDING;
-        IoMarkIrpPending(Irp);
-        IoQueueWorkItem(Context->WorkItem, CreatePinWorkerRoutine, DelayedWorkQueue, (PVOID)Context);
-        return STATUS_PENDING;
-    }
-}
-
-
+
+    /* allocate pin create item */
+    PinCreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM), TAG_PORTCLASS);
+    if (!PinCreateItem)
+    {
+        /* not enough memory */
+        Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    /* initialize pin create item */
+    PinCreateItem->Context = (PVOID)Filter;
+    PinCreateItem->Create = PcCreatePinDispatch;
+    RtlInitUnicodeString(&PinCreateItem->ObjectClass, KS_NAME_PIN);
+    /* FIXME copy security descriptor */
+
+    /* now allocate a dispatch object */
+    Status = NewDispatchObject(Irp, Filter, 1, PinCreateItem);
+
+    /* complete request */
+    Irp->IoStatus.Status = Status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
+}
 
 NTSTATUS
 NewPortTopology(

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -162,7 +162,8 @@
 NewDispatchObject(
     IN PIRP Irp,
     IN IIrpTarget * Target,
-    IN LPWSTR Name);
+    IN ULONG ObjectCreateItemCount,
+    IN PKSOBJECT_CREATE_ITEM ObjectCreateItem);
 
 PMINIPORTWAVECYCLIC
 GetWaveCyclicMiniport(

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -121,9 +121,9 @@
     IN PKSIDENTIFIER  Request,
     IN OUT PVOID  Data)
 {
-    PKSOBJECT_CREATE_ITEM CreateItem;
+    PIO_STACK_LOCATION IoStack;
+    //PKSOBJECT_CREATE_ITEM CreateItem;
     PSUBDEVICE_DESCRIPTOR Descriptor;
-    PIO_STACK_LOCATION IoStack;
     IIrpTarget * IrpTarget;
     IPort *Port;
     ISubdevice *SubDevice;
@@ -134,10 +134,11 @@
     Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
     ASSERT(Descriptor);
 
-    /* Access the create item */
-    CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
     /* Get the IrpTarget */
-    IrpTarget = (IIrpTarget*)CreateItem->Context;
+    IrpTarget = (IIrpTarget*)IoStack->FileObject->FsContext2;
     /* Get the parent */
     Status = IrpTarget->lpVtbl->QueryInterface(IrpTarget, &IID_IPort, (PVOID*)&Port);
     if (!NT_SUCCESS(Status))

Modified: trunk/reactos/drivers/wdm/audio/filters/kmixer/filter.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/filters/kmixer/filter.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/filters/kmixer/filter.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/filters/kmixer/filter.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -181,38 +181,38 @@
 
 NTSTATUS
 NTAPI
+DispatchCreateKMixPin(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp)
+{
+    NTSTATUS Status;
+
+    DPRINT("DispatchCreateKMix entered\n");
+
+    /* create the pin */
+    Status = CreatePin(Irp);
+
+    Irp->IoStatus.Information = 0;
+    Irp->IoStatus.Status = Status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return Status;
+}
+
+NTSTATUS
+NTAPI
 DispatchCreateKMix(
     IN  PDEVICE_OBJECT DeviceObject,
     IN  PIRP Irp)
 {
     NTSTATUS Status;
     KSOBJECT_HEADER ObjectHeader;
-    PIO_STACK_LOCATION IoStatus;
-    LPWSTR Buffer;
     PKSOBJECT_CREATE_ITEM CreateItem;
 
     static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}";
 
-    IoStatus = IoGetCurrentIrpStackLocation(Irp);
-    Buffer = IoStatus->FileObject->FileName.Buffer;
-
     DPRINT("DispatchCreateKMix entered\n");
 
-    if (Buffer)
-    {
-        /* is the request for a new pin */
-        if (wcsstr(Buffer, KS_NAME_PIN))
-        {
-            Status = CreatePin(Irp);
-
-            Irp->IoStatus.Information = 0;
-            Irp->IoStatus.Status = Status;
-            IoCompleteRequest(Irp, IO_NO_INCREMENT);
-            return Status;
-        }
-    }
-
-    /* allocate create item */
+   /* allocate create item */
     CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
     if (!CreateItem)
     {
@@ -225,7 +225,10 @@
     /* zero create struct */
     RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
 
-    RtlInitUnicodeString(&CreateItem->ObjectClass, L"KMixer");
+    /* initialize pin create item */
+    CreateItem->Create = DispatchCreateKMixPin;
+    RtlInitUnicodeString(&CreateItem->ObjectClass, KS_NAME_PIN);
+
 
     /* allocate object header */
     Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);

Modified: trunk/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -5,7 +5,7 @@
 #include <portcls.h>
 #include <ks.h>
 #include <ksmedia.h>
-#define NDEBUG
+#define YDEBUG
 #include <debug.h>
 
 #include <samplerate.h>
@@ -18,6 +18,14 @@
 
 }KMIXER_DEVICE_EXT, *PKMIXER_DEVICE_EXT;
 
+typedef struct
+{
+    KSPIN_LOCK Lock;
+
+
+}SUM_NODE_CONTEXT, *PSUM_NODE_CONTEXT;
+
+
 NTSTATUS
 NTAPI
 KMixAllocateDeviceHeader(

Modified: trunk/reactos/drivers/wdm/audio/sysaudio/control.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/sysaudio/control.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/sysaudio/control.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/sysaudio/control.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -141,7 +141,7 @@
     HANDLE PinHandle;
     PFILE_OBJECT FileObject;
 
-    Status = KsCreatePin(KMixerHandle, PinConnect, GENERIC_READ | GENERIC_WRITE, &PinHandle);//, L"KMixer");
+    Status = KsCreatePin(KMixerHandle, PinConnect, GENERIC_READ | GENERIC_WRITE, &PinHandle);
 
     if (!NT_SUCCESS(Status))
     {

Modified: trunk/reactos/drivers/wdm/audio/sysaudio/dispatcher.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/sysaudio/dispatcher.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/sysaudio/dispatcher.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/sysaudio/dispatcher.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -181,6 +181,25 @@
 
 NTSTATUS
 NTAPI
+DispatchCreateSysAudioPin(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp)
+{
+    NTSTATUS Status;
+
+    DPRINT("DispatchCreateSysAudio entered\n");
+    /* create the virtual pin */
+    Status = CreateSysAudioPin(Irp);
+
+    /* store result */
+    Irp->IoStatus.Information = 0;
+    Irp->IoStatus.Status = Status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return Status;
+}
+
+NTSTATUS
+NTAPI
 DispatchCreateSysAudio(
     IN  PDEVICE_OBJECT DeviceObject,
     IN  PIRP Irp)
@@ -188,30 +207,10 @@
     NTSTATUS Status;
     KSOBJECT_HEADER ObjectHeader;
     PKSOBJECT_CREATE_ITEM CreateItem;
-    PIO_STACK_LOCATION IoStatus;
-    LPWSTR Buffer;
-    PSYSAUDIODEVEXT DeviceExtension;
+
     static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}";
 
-    IoStatus = IoGetCurrentIrpStackLocation(Irp);
-    Buffer = IoStatus->FileObject->FileName.Buffer;
-
     DPRINT("DispatchCreateSysAudio entered\n");
-
-    if (Buffer)
-    {
-        /* is the request for a new pin */
-        if (wcsstr(Buffer, KS_NAME_PIN))
-        {
-            Status = CreateDispatcher(Irp);
-            DPRINT("Virtual pin Status %x FileObject %p\n", Status, IoStatus->FileObject);
-
-            Irp->IoStatus.Information = 0;
-            Irp->IoStatus.Status = Status;
-            IoCompleteRequest(Irp, IO_NO_INCREMENT);
-            return Status;
-        }
-    }
 
     /* allocate create item */
     CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
@@ -223,14 +222,12 @@
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
-    /* get device extension */
-    DeviceExtension = (PSYSAUDIODEVEXT) DeviceObject->DeviceExtension;
-
     /* zero create struct */
     RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
 
-    /* store create context */
-    RtlInitUnicodeString(&CreateItem->ObjectClass, L"SysAudio");
+    /* setup create context */
+    CreateItem->Create = DispatchCreateSysAudioPin;
+    RtlInitUnicodeString(&CreateItem->ObjectClass, KS_NAME_PIN);
 
     /* allocate object header */
     Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);

Modified: trunk/reactos/drivers/wdm/audio/sysaudio/pin.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/sysaudio/pin.c?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/sysaudio/pin.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/sysaudio/pin.c [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -419,7 +419,7 @@
 };
 
 NTSTATUS
-CreateDispatcher(
+CreateSysAudioPin(
     IN PIRP Irp)
 {
     NTSTATUS Status;

Modified: trunk/reactos/drivers/wdm/audio/sysaudio/sysaudio.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/sysaudio/sysaudio.h?rev=42143&r1=42142&r2=42143&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/sysaudio/sysaudio.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/sysaudio/sysaudio.h [iso-8859-1] Wed Jul 22 16:42:51 2009
@@ -124,7 +124,7 @@
     IN ULONG Index);
 
 NTSTATUS
-CreateDispatcher(
+CreateSysAudioPin(
     IN PIRP Irp);
 
 ULONG



More information about the Ros-diffs mailing list