Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / reactos / drivers / ksfilter / ks / device.c
diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c
deleted file mode 100644 (file)
index b2678c4..0000000
+++ /dev/null
@@ -1,892 +0,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS Kernel Streaming
- * FILE:            drivers/ksfilter/ks/device.c
- * PURPOSE:         KS IKsDevice interface functions
- * PROGRAMMER:      Johannes Anderwald
- */
-
-#include "precomp.h"
-
-#define NDEBUG
-#include <debug.h>
-
-NTSTATUS
-NTAPI
-IKsDevice_fnQueryInterface(
-    IN IKsDevice * iface,
-    REFIID refiid,
-    PVOID* Output)
-{
-    NTSTATUS Status;
-    PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    if (IsEqualGUIDAligned(refiid, &IID_IUnknown))
-    {
-        *Output = &This->BasicHeader.OuterUnknown;
-        _InterlockedIncrement(&This->ref);
-        return STATUS_SUCCESS;
-    }
-
-    if (This->BasicHeader.ClientAggregate)
-    {
-         /* using client aggregate */
-         Status = This->BasicHeader.ClientAggregate->lpVtbl->QueryInterface(This->BasicHeader.ClientAggregate, refiid, Output);
-
-         if (NT_SUCCESS(Status))
-         {
-             /* client aggregate supports interface */
-             return Status;
-         }
-    }
-
-    DPRINT("IKsDevice_fnQueryInterface no interface\n");
-    return STATUS_NOT_SUPPORTED;
-}
-
-ULONG
-NTAPI
-IKsDevice_fnAddRef(
-    IN IKsDevice * iface)
-{
-    PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    return InterlockedIncrement(&This->ref);
-}
-
-ULONG
-NTAPI
-IKsDevice_fnRelease(
-    IN IKsDevice * iface)
-{
-    PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    InterlockedDecrement(&This->ref);
-
-    return This->ref;
-}
-
-
-
-PKSDEVICE
-NTAPI
-IKsDevice_fnGetStruct(
-    IN IKsDevice * iface)
-{
-    PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    return &This->KsDevice;
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_fnInitializeObjectBag(
-    IN IKsDevice * iface,
-    IN PKSIOBJECT_BAG Bag,
-    IN PRKMUTEX Mutex)
-{
-    PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    if (!Mutex)
-    {
-        /* use device mutex */
-        Mutex = &This->BagMutex;
-    }
-
-    /* initialize object bag */
-    Bag->BagMutex = Mutex;
-    Bag->DeviceHeader = (PKSIDEVICE_HEADER)This;
-    InitializeListHead(&Bag->ObjectList);
-
-    /* insert bag into device list */
-    InsertTailList(&This->ObjectBags, &Bag->Entry);
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_fnAcquireDevice(
-    IN IKsDevice * iface)
-{
-    PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    return KeWaitForSingleObject(&This->DeviceMutex, Executive, KernelMode, FALSE, NULL);
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_fnReleaseDevice(
-    IN IKsDevice * iface)
-{
-    PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    return KeReleaseMutex(&This->DeviceMutex, FALSE);
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_fnGetAdapterObject(
-    IN IKsDevice * iface,
-    IN PADAPTER_OBJECT * Object,
-    IN PULONG MaxMappingsByteCount,
-    IN PULONG MappingTableStride)
-{
-    PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    *Object = This->AdapterObject;
-    *MaxMappingsByteCount = This->MaxMappingsByteCount;
-    *MappingTableStride = This->MappingTableStride;
-
-    return STATUS_SUCCESS;
-
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_fnAddPowerEntry(
-    IN IKsDevice * iface,
-    IN struct KSPOWER_ENTRY * Entry,
-    IN IKsPowerNotify* Notify)
-{
-    //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_fnRemovePowerEntry(
-    IN IKsDevice * iface,
-    IN struct KSPOWER_ENTRY * Entry)
-{
-    //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_fnPinStateChange(
-    IN IKsDevice * iface,
-    IN KSPIN Pin,
-    IN PIRP Irp,
-    IN KSSTATE OldState,
-    IN KSSTATE NewState)
-{
-    //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_fnArbitrateAdapterChannel(
-    IN IKsDevice * iface,
-    IN ULONG NumberOfMapRegisters,
-    IN PDRIVER_CONTROL ExecutionRoutine,
-    IN PVOID Context)
-{
-    PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-    NTSTATUS Status;
-
-    DPRINT("IKsDevice_fnArbitrateAdapterChannel NumberOfMapRegisters %lu ExecutionRoutine %p Context %p Irql %lu\n", NumberOfMapRegisters, ExecutionRoutine, Context, KeGetCurrentIrql());
-
-    /* sanity check */
-    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
-    ASSERT(This->AdapterObject);
-
-    /* allocate adapter channel */
-    Status = IoAllocateAdapterChannel(This->AdapterObject, This->KsDevice.FunctionalDeviceObject, NumberOfMapRegisters, ExecutionRoutine, Context);
-
-    /* done */
-    return Status;
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_fnCheckIoCapability(
-    IN IKsDevice * iface,
-    IN ULONG Unknown)
-{
-    //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown);
-
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-static IKsDeviceVtbl vt_IKsDevice =
-{
-    IKsDevice_fnQueryInterface,
-    IKsDevice_fnAddRef,
-    IKsDevice_fnRelease,
-    IKsDevice_fnGetStruct,
-    IKsDevice_fnInitializeObjectBag,
-    IKsDevice_fnAcquireDevice,
-    IKsDevice_fnReleaseDevice,
-    IKsDevice_fnGetAdapterObject,
-    IKsDevice_fnAddPowerEntry,
-    IKsDevice_fnRemovePowerEntry,
-    IKsDevice_fnPinStateChange,
-    IKsDevice_fnArbitrateAdapterChannel,
-    IKsDevice_fnCheckIoCapability
-};
-
-
-VOID
-NTAPI
-IKsDevice_PnpPostStart(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PVOID  Context)
-{
-    NTSTATUS Status;
-    PPNP_POSTSTART_CONTEXT Ctx = (PPNP_POSTSTART_CONTEXT)Context;
-
-    /* call driver pnp post routine */
-    Status = Ctx->DeviceHeader->KsDevice.Descriptor->Dispatch->PostStart(&Ctx->DeviceHeader->KsDevice);
-
-    if (!NT_SUCCESS(Status))
-    {
-        /* set state to disabled */
-        Ctx->DeviceHeader->TargetState  = KSTARGET_STATE_DISABLED;
-    }
-    else
-    {
-        /* set state to enabled */
-        Ctx->DeviceHeader->TargetState = KSTARGET_STATE_ENABLED;
-        Status = KspSetFilterFactoriesState(Ctx->DeviceHeader, TRUE);
-    }
-
-    /* free work item */
-    IoFreeWorkItem(Ctx->WorkItem);
-
-    /* free work context */
-    FreeItem(Ctx);
-
-    DPRINT("IKsDevice_PnpPostStart: PostStart Routine returned %x\n", Status);
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_PnpStartDevice(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PIRP Irp)
-{
-    PIO_STACK_LOCATION IoStack;
-    PDEVICE_EXTENSION DeviceExtension;
-    PKSIDEVICE_HEADER DeviceHeader;
-    PPNP_POSTSTART_CONTEXT Ctx = NULL;
-    NTSTATUS Status;
-    PCM_RESOURCE_LIST TranslatedResourceList;
-    PCM_RESOURCE_LIST UntranslatedResourceList;
-
-    /* get current stack location */
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    /* get device extension */
-    DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
-    /* get device header */
-    DeviceHeader = DeviceExtension->DeviceHeader;
-
-    DPRINT("IKsDevice_PnpStartDevice DeviceHeader %p\n", DeviceHeader);
-
-    /* first forward irp to lower device object */
-    Status = KspForwardIrpSynchronous(DeviceObject, Irp);
-
-    /* check for success */
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("NextDevice object failed to start with %x\n", Status);
-        Irp->IoStatus.Status = Status;
-        CompleteRequest(Irp, IO_NO_INCREMENT);
-        return Status;
-    }
-
-    TranslatedResourceList = IoStack->Parameters.StartDevice.AllocatedResourcesTranslated;
-    UntranslatedResourceList = IoStack->Parameters.StartDevice.AllocatedResources;
-
-    ASSERT(DeviceHeader->KsDevice.Descriptor);
-
-    /* do we have a device descriptor */
-    if (DeviceHeader->KsDevice.Descriptor)
-    {
-        /* does the device want pnp notifications */
-        if (DeviceHeader->KsDevice.Descriptor->Dispatch)
-        {
-            /* does the driver care about IRP_MN_START_DEVICE */
-            if (DeviceHeader->KsDevice.Descriptor->Dispatch->Start)
-            {
-                /* call driver start device routine */
-                Status = DeviceHeader->KsDevice.Descriptor->Dispatch->Start(&DeviceHeader->KsDevice, Irp,
-                                                                   TranslatedResourceList,
-                                                                   UntranslatedResourceList);
-
-
-                DPRINT("IKsDevice_PnpStartDevice Start %p, Context %p\n", DeviceHeader->KsDevice.Descriptor->Dispatch->Start, DeviceHeader->KsDevice.Context);
-                ASSERT(Status != STATUS_PENDING);
-
-                if (!NT_SUCCESS(Status))
-                {
-                    DPRINT1("Driver: failed to start %x\n", Status);
-                    Irp->IoStatus.Status = Status;
-                    CompleteRequest(Irp, IO_NO_INCREMENT);
-                    return Status;
-                }
-
-                /* set state to run */
-                DeviceHeader->KsDevice.Started = TRUE;
-
-            }
-
-            /* does the driver need post start routine */
-            if (DeviceHeader->KsDevice.Descriptor->Dispatch->PostStart)
-            {
-                /* allocate pnp post workitem context */
-                Ctx = (PPNP_POSTSTART_CONTEXT)AllocateItem(NonPagedPool, sizeof(PNP_POSTSTART_CONTEXT));
-                if (!Ctx)
-                {
-                    /* no memory */
-                    Status = STATUS_INSUFFICIENT_RESOURCES;
-                }
-                else
-                {
-                    /* allocate a work item */
-                    Ctx->WorkItem = IoAllocateWorkItem(DeviceObject);
-
-                    if (!Ctx->WorkItem)
-                    {
-                         /* no memory */
-                        FreeItem(Ctx);
-                        Ctx = NULL;
-                        Status = STATUS_INSUFFICIENT_RESOURCES;
-                    }
-                    else
-                    {
-                        /* store device header for post-start pnp processing */
-                        Ctx->DeviceHeader = DeviceHeader;
-                    }
-                }
-            }
-            else
-            {
-                /* set state to enabled, IRP_MJ_CREATE request may now succeed */
-                DeviceHeader->TargetState = KSTARGET_STATE_ENABLED;
-                Status = KspSetFilterFactoriesState(DeviceHeader, TRUE);
-            }
-        }
-        else
-        {
-            /* set state to run */
-            DeviceHeader->KsDevice.Started = TRUE;
-        }
-    }
-
-    /* store result */
-    Irp->IoStatus.Status = Status;
-    /* complete request */
-    CompleteRequest(Irp, IO_NO_INCREMENT);
-
-    if (Ctx)
-    {
-        /* queue a work item for driver post start routine */
-        IoQueueWorkItem(Ctx->WorkItem, IKsDevice_PnpPostStart, DelayedWorkQueue, (PVOID)Ctx);
-    }
-
-    /* return result */
-    DPRINT("IKsDevice_PnpStartDevice Status %x PostStartRoutine %p\n", Status, Ctx);
-    return Status;
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_Pnp(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PIRP Irp)
-{
-    PIO_STACK_LOCATION IoStack;
-    PDEVICE_EXTENSION DeviceExtension;
-    PKSIDEVICE_HEADER DeviceHeader;
-    PKSDEVICE_DISPATCH Dispatch = NULL;
-    NTSTATUS Status;
-
-    /* get current stack location */
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-
-    /* get device extension */
-    DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
-    /* get device header */
-    DeviceHeader = DeviceExtension->DeviceHeader;
-
-    /* do we have a device descriptor */
-    if (DeviceHeader->KsDevice.Descriptor && DeviceHeader->KsDevice.Descriptor->Dispatch)
-    {
-        /* does the device want pnp notifications */
-        Dispatch = (PKSDEVICE_DISPATCH)DeviceHeader->KsDevice.Descriptor->Dispatch;
-    }
-
-    switch (IoStack->MinorFunction)
-    {
-        case IRP_MN_START_DEVICE:
-        {
-            return IKsDevice_PnpStartDevice(DeviceObject, Irp);
-        }
-
-        case IRP_MN_QUERY_STOP_DEVICE:
-        {
-            Status = STATUS_SUCCESS;
-            /* check for pnp notification support */
-            if (Dispatch)
-            {
-                /* check for query stop support */
-                if (Dispatch->QueryStop)
-                {
-                    /* call driver's query stop */
-                    Status = Dispatch->QueryStop(&DeviceHeader->KsDevice, Irp);
-                    ASSERT(Status != STATUS_PENDING);
-                }
-            }
-
-            if (!NT_SUCCESS(Status))
-            {
-                DPRINT1("Driver: query stop failed %x\n", Status);
-                Irp->IoStatus.Status = Status;
-                CompleteRequest(Irp, IO_NO_INCREMENT);
-                return Status;
-            }
-
-            /* pass the irp down the driver stack */
-            Status = KspForwardIrpSynchronous(DeviceObject, Irp);
-
-            DPRINT("Next Device: Status %x\n", Status);
-
-            Irp->IoStatus.Status = Status;
-            CompleteRequest(Irp, IO_NO_INCREMENT);
-            return Status;
-        }
-
-        case IRP_MN_REMOVE_DEVICE:
-        {
-            /* Clean up */
-            if (Dispatch)
-            {
-                /* check for remove support */
-                if (Dispatch->Remove)
-                {
-                    /* call driver's stop routine */
-                    Dispatch->Remove(&DeviceHeader->KsDevice, Irp);
-                }
-            }
-
-            /* pass the irp down the driver stack */
-            Status = KspForwardIrpSynchronous(DeviceObject, Irp);
-
-            DPRINT("Next Device: Status %x\n", Status);
-
-            /* FIXME delete device resources */
-
-
-            Irp->IoStatus.Status = Status;
-            CompleteRequest(Irp, IO_NO_INCREMENT);
-            return Status;
-        }
-        case IRP_MN_QUERY_INTERFACE:
-        {
-            Status = STATUS_UNSUCCESSFUL;
-            /* check for pnp notification support */
-            if (Dispatch)
-            {
-                /* check for query interface support */
-                if (Dispatch->QueryInterface)
-                {
-                    /* call driver's query interface */
-                    Status = Dispatch->QueryInterface(&DeviceHeader->KsDevice, Irp);
-                    ASSERT(Status != STATUS_PENDING);
-                }
-            }
-
-            if (NT_SUCCESS(Status))
-            {
-                /* driver supports a private interface */
-                DPRINT1("IRP_MN_QUERY_INTERFACE Device supports interface\n");
-                Irp->IoStatus.Status = Status;
-                CompleteRequest(Irp, IO_NO_INCREMENT);
-                return Status;
-            }
-
-            /* pass the irp down the driver stack */
-            Status = KspForwardIrpSynchronous(DeviceObject, Irp);
-
-            DPRINT1("IRP_MN_QUERY_INTERFACE Next Device: Status %x\n", Status);
-            Irp->IoStatus.Status = Status;
-            CompleteRequest(Irp, IO_NO_INCREMENT);
-            return Status;
-        }
-        case IRP_MN_QUERY_DEVICE_RELATIONS:
-        {
-            /* pass the irp down the driver stack */
-            Status = KspForwardIrpSynchronous(DeviceObject, Irp);
-
-            DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS Next Device: Status %x\n", Status);
-
-            //Irp->IoStatus.Status = Status;
-            CompleteRequest(Irp, IO_NO_INCREMENT);
-            return Status;
-        }
-        case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
-        {
-            /* pass the irp down the driver stack */
-            //Status = KspForwardIrpSynchronous(DeviceObject, Irp);
-            Status = Irp->IoStatus.Status;
-            DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS Next Device: Status %x\n", Status);
-
-            //Irp->IoStatus.Status = Status;
-            CompleteRequest(Irp, IO_NO_INCREMENT);
-            return Status;
-        }
-       case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
-       {
-            /* pass the irp down the driver stack */
-            Status = KspForwardIrpSynchronous(DeviceObject, Irp);
-
-            DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS Next Device: Status %x\n", Status);
-
-            Irp->IoStatus.Status = Status;
-            CompleteRequest(Irp, IO_NO_INCREMENT);
-            return Status;
-       }
-       default:
-          DPRINT1("unhandled function %u\n", IoStack->MinorFunction);
-          /* pass the irp down the driver stack */
-          Status = KspForwardIrpSynchronous(DeviceObject, Irp);
-
-          Irp->IoStatus.Status = Status;
-          CompleteRequest(Irp, IO_NO_INCREMENT);
-          return Status;
-    }
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_Power(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PIRP Irp)
-{
-    UNIMPLEMENTED;
-
-    /* TODO */
-
-    Irp->IoStatus.Status = STATUS_SUCCESS;
-    Irp->IoStatus.Information = 0;
-    CompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-IKsDevice_Create(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PIRP Irp)
-{
-    PCREATE_ITEM_ENTRY CreateItemEntry;
-    PIO_STACK_LOCATION IoStack;
-    PDEVICE_EXTENSION DeviceExtension;
-    PKSIDEVICE_HEADER DeviceHeader;
-    PKSIOBJECT_HEADER ObjectHeader;
-    NTSTATUS Status;
-
-    DPRINT("IKsDevice_Create\n");
-    /* get current stack location */
-    IoStack = IoGetCurrentIrpStackLocation(Irp);
-    /* get device extension */
-    DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
-    /* get device header */
-    DeviceHeader = DeviceExtension->DeviceHeader;
-
-    if (IoStack->FileObject->FileName.Buffer == NULL)
-    {
-        // ReactOS PnPMgr still sucks
-        ASSERT(IoStack->FileObject->FileName.Length == 0);
-        Irp->IoStatus.Status = STATUS_SUCCESS;
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-        DPRINT1("ReactOS PnP hack\n");
-        return STATUS_SUCCESS;
-    }
-
-    /* acquire list lock */
-    IKsDevice_fnAcquireDevice((IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown);
-
-    /* sanity check */
-    ASSERT(IoStack->FileObject);
-
-    /* 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->FsContext2;
-
-        /* sanity check */
-        ASSERT(ObjectHeader);
-
-        /* find a matching a create item */
-        Status = FindMatchingCreateItem(&ObjectHeader->ItemList,
-                                        &IoStack->FileObject->FileName,
-                                        &CreateItemEntry);
-    }
-    else
-    {
-        /* request to create a filter */
-        Status = FindMatchingCreateItem(&DeviceHeader->ItemList,
-                                        &IoStack->FileObject->FileName,
-                                        &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);
-        }
-    }
-
-    /* release list lock */
-    IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown);
-
-    /* done */
-    return Status;
-
-
-}
-
-/*
-    @implemented
-*/
-KSDDKAPI
-NTSTATUS
-NTAPI
-KsInitializeDevice(
-    IN PDEVICE_OBJECT FunctionalDeviceObject,
-    IN PDEVICE_OBJECT PhysicalDeviceObject,
-    IN PDEVICE_OBJECT NextDeviceObject,
-    IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL)
-{
-    PDEVICE_EXTENSION DeviceExtension;
-    PKSIDEVICE_HEADER Header;
-    ULONG Index;
-    PKSIOBJECT_BAG Bag;
-    NTSTATUS Status = STATUS_SUCCESS;
-
-    DPRINT1("KsInitializeDevice Descriptor %p\n", Descriptor);
-
-    /* get device extension */
-    DeviceExtension = (PDEVICE_EXTENSION)FunctionalDeviceObject->DeviceExtension;
-
-    /* first allocate device header */
-    Status = KsAllocateDeviceHeader((KSDEVICE_HEADER*)&DeviceExtension->DeviceHeader, 0, NULL);
-
-    /* point to allocated header */
-    Header = DeviceExtension->DeviceHeader;
-
-    DPRINT1("DeviceHeader %p\n", DeviceExtension->DeviceHeader);
-
-    if (Descriptor && Descriptor->Dispatch)
-    {
-        DPRINT("Descriptor Add %p\n", Descriptor->Dispatch->Add);
-        DPRINT("Descriptor Start %p\n", Descriptor->Dispatch->Start);
-        DPRINT("Descriptor PostStart %p\n", Descriptor->Dispatch->PostStart);
-        DPRINT("Descriptor QueryStop %p\n", Descriptor->Dispatch->QueryStop);
-        DPRINT("Descriptor CancelStop %p\n", Descriptor->Dispatch->CancelStop);
-        DPRINT("Descriptor Stop %p\n", Descriptor->Dispatch->Stop);
-        DPRINT("Descriptor QueryRemove %p\n", Descriptor->Dispatch->QueryRemove);
-        DPRINT("Descriptor CancelRemove %p\n", Descriptor->Dispatch->CancelRemove);
-        DPRINT("Descriptor Remove %p\n", Descriptor->Dispatch->Remove);
-        DPRINT("Descriptor QueryCapabilities %p\n", Descriptor->Dispatch->QueryCapabilities);
-        DPRINT("Descriptor SurpriseRemoval %p\n", Descriptor->Dispatch->SurpriseRemoval);
-        DPRINT("Descriptor QueryPower %p\n", Descriptor->Dispatch->QueryPower);
-        DPRINT("Descriptor SetPower %p\n", Descriptor->Dispatch->SetPower);
-        DPRINT("Descriptor QueryInterface %p\n", Descriptor->Dispatch->QueryInterface);
-    }
-
-    /* check for success */
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("KsInitializeDevice Failed to allocate device header with %x\n", Status);
-        return Status;
-    }
-
-    /* initialize IKsDevice interface */
-    Header->BasicHeader.OuterUnknown = (PUNKNOWN)&vt_IKsDevice;
-    Header->ref = 1;
-
-    /* allocate object bag */
-    Header->KsDevice.Bag = AllocateItem(NonPagedPool, sizeof(KSIOBJECT_BAG));
-    if (!Header->KsDevice.Bag)
-    {
-        /* no memory */
-        KsFreeDeviceHeader((KSDEVICE_HEADER*)&DeviceExtension->DeviceHeader);
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    /* initialize object bag */
-    KeInitializeMutex(&Header->BagMutex, 0);
-    KeInitializeMutex(&Header->DeviceMutex, 0);
-
-    Bag = (PKSIOBJECT_BAG)Header->KsDevice.Bag;
-    Bag->BagMutex = &Header->BagMutex;
-    InitializeListHead(&Header->ObjectBags);
-    InitializeListHead(&Bag->ObjectList);
-    Bag->DeviceHeader = (PVOID)Header;
-
-    /* insert bag into device list */
-    InsertTailList(&Header->ObjectBags, &Bag->Entry);
-
-    /* initialize device header */
-    Header->KsDevice.FunctionalDeviceObject = FunctionalDeviceObject;
-    Header->KsDevice.PhysicalDeviceObject = PhysicalDeviceObject;
-    Header->KsDevice.NextDeviceObject = NextDeviceObject;
-    Header->KsDevice.Descriptor = Descriptor;
-    Header->KsDevice.SystemPowerState = PowerSystemWorking;
-    Header->KsDevice.DevicePowerState = PowerDeviceD0;
-    Header->KsDevice.Started = FALSE;
-    Header->KsDevice.Context = NULL;
-    KsSetDevicePnpAndBaseObject(Header, PhysicalDeviceObject, NextDeviceObject);
-
-
-
-    if (Descriptor)
-    {
-        /* create a filter factory for each filter descriptor */
-        DPRINT("KsInitializeDevice FilterDescriptorCount %lu\n", Descriptor->FilterDescriptorsCount);
-        for(Index = 0; Index < Descriptor->FilterDescriptorsCount; Index++)
-        {
-            Status = KspCreateFilterFactory(FunctionalDeviceObject, Descriptor->FilterDescriptors[Index], NULL, NULL, 0, NULL, NULL, NULL);
-
-            DPRINT("KsInitializeDevice Index %lu KspCreateFilterFactory Status %lx\n", Index, Status);
-            /* check for success */
-            if (!NT_SUCCESS(Status))
-            {
-                DPRINT1("KspCreateFilterFactory failed with %x\n", Status);
-                /* FIXME memory leak */
-                return Status;
-            }
-        }
-
-        /* does the driver care about the add device */
-        if (Descriptor->Dispatch && Descriptor->Dispatch->Add)
-        {
-            Status = Descriptor->Dispatch->Add(&Header->KsDevice);
-            DPRINT("Driver: AddHandler Status %x\n", Status);
-        }
-
-        Header->KsDevice.Descriptor = Descriptor;
-    }
-
-
-   return Status;
-}
-
-/*
-    @implemented
-*/
-KSDDKAPI
-NTSTATUS
-NTAPI
-KsReferenceSoftwareBusObject(
-    IN KSDEVICE_HEADER  Header)
-{
-     IKsDevice * Device;
-     PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
-
-     /* get device interface */
-     Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown;
-
-     if (Device)
-     {
-         /* reference device interface */
-         Device->lpVtbl->AddRef(Device);
-     }
-
-    return STATUS_SUCCESS;
-}
-
-/*
-    @implemented
-*/
-KSDDKAPI
-NTSTATUS
-NTAPI
-KsReferenceBusObject(
-    IN  KSDEVICE_HEADER Header)
-{
-     IKsDevice * Device;
-     PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
-
-     /* get device interface */
-     Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown;
-
-     if (Device)
-     {
-         /* reference device interface */
-         Device->lpVtbl->AddRef(Device);
-     }
-
-    return STATUS_SUCCESS;
-
-}
-
-/*
-    @implemented
-*/
-KSDDKAPI
-VOID
-NTAPI
-KsDereferenceBusObject(
-    IN  KSDEVICE_HEADER Header)
-{
-     IKsDevice * Device;
-     PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
-
-     /* get device interface */
-     Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown;
-
-     if (Device)
-     {
-         /* release device interface */
-         Device->lpVtbl->Release(Device);
-     }
-}
-
-/*
-    @implemented
-*/
-KSDDKAPI
-VOID
-NTAPI
-KsDereferenceSoftwareBusObject(
-    IN KSDEVICE_HEADER  Header)
-{
-     IKsDevice * Device;
-     PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
-
-     DPRINT("KsDereferenceSoftwareBusObject DeviceHeader %p\n", Header);
-
-     /* get device interface */
-     Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown;
-
-     if (Device)
-     {
-         /* release device interface */
-         Device->lpVtbl->Release(Device);
-     }
-}