[ros-diffs] [janderwald] 39605: - Partly implement IPortFilterWaveCyclic_fnNewIrpTarget - Store KSPIN_DESCRIPTOR in subdevice descriptor - Return correct result for IInterruptSync_fnCallSynchronizedRoutine - Add stub interface for IPortPinWaveCyclic - Implement PcValidateConnectRequest

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sun Feb 15 14:29:02 CET 2009


Author: janderwald
Date: Sun Feb 15 07:29:01 2009
New Revision: 39605

URL: http://svn.reactos.org/svn/reactos?rev=39605&view=rev
Log:
- Partly implement IPortFilterWaveCyclic_fnNewIrpTarget
- Store KSPIN_DESCRIPTOR in subdevice descriptor
- Return correct result for IInterruptSync_fnCallSynchronizedRoutine
- Add stub interface for IPortPinWaveCyclic
- Implement PcValidateConnectRequest

Added:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c   (with props)
Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
    trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
    trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h
    trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.c

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c?rev=39605&r1=39604&r2=39605&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c [iso-8859-1] Sun Feb 15 07:29:01 2009
@@ -5,6 +5,9 @@
     IPortFilterWaveCyclicVtbl *lpVtbl;
 
     LONG ref;
+
+    IPortWaveCyclic* Port;
+    IPortPinWaveCyclic * Pin;
 
 }IPortFilterWaveCyclicImpl;
 
@@ -80,8 +83,53 @@
     IN PIRP Irp,
     IN KSOBJECT_CREATE *CreateObject)
 {
-
-    return STATUS_UNSUCCESSFUL;
+    ISubdevice * ISubDevice;
+    NTSTATUS Status;
+    IPortPinWaveCyclic * Pin;
+
+    SUBDEVICE_DESCRIPTOR * Descriptor;
+    PKSPIN_CONNECT ConnectDetails;
+
+    IPortFilterWaveCyclicImpl * This = (IPortFilterWaveCyclicImpl *)iface;
+
+    ASSERT(This->Port);
+
+    Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice);
+    if (!NT_SUCCESS(Status))
+        return STATUS_UNSUCCESSFUL;
+
+    Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor);
+    if (!NT_SUCCESS(Status))
+        return STATUS_UNSUCCESSFUL;
+
+    Status = PcValidateConnectRequest(Irp, &Descriptor->Factory, &ConnectDetails);
+    if (!NT_SUCCESS(Status))
+    {
+        ISubDevice->lpVtbl->Release(ISubDevice);
+        return STATUS_UNSUCCESSFUL;
+    }
+
+    ISubDevice->lpVtbl->Release(ISubDevice);
+
+    Status = NewPortPinWaveCyclic(&Pin);
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    Status = Pin->lpVtbl->Init(Pin, This->Port, iface, ConnectDetails, &Descriptor->Factory.KsPinDescriptor[ConnectDetails->PinId]);
+    if (!NT_SUCCESS(Status))
+    {
+        Pin->lpVtbl->Release(Pin);
+        return Status;
+    }
+
+    /* store pin handle */
+    This->Pin = Pin;
+
+    /* store result */
+    *OutTarget = (IIrpTarget*)Pin;
+    return Status;
 }
 
 /*
@@ -256,7 +304,8 @@
 
 
 NTSTATUS NewPortFilterWaveCyclic(
-    OUT IPortFilterWaveCyclic ** OutFilter)
+    OUT IPortFilterWaveCyclic ** OutFilter,
+    IN IPortWaveCyclic* iface)
 {
     IPortFilterWaveCyclicImpl * This;
 
@@ -267,6 +316,10 @@
     /* initialize IPortFilterWaveCyclic */
     This->ref = 1;
     This->lpVtbl = &vt_IPortFilterWaveCyclic;
+    This->Port = iface;
+
+    /* increment reference count */
+    iface->lpVtbl->AddRef(iface);
 
     /* return result */
     *OutFilter = (IPortFilterWaveCyclic*)&This->lpVtbl;

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h?rev=39605&r1=39604&r2=39605&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h [iso-8859-1] Sun Feb 15 07:29:01 2009
@@ -99,8 +99,16 @@
 
 typedef struct
 {
+    ULONG PinDescriptorCount;
+    ULONG PinDescriptorSize;
+    KSPIN_DESCRIPTOR * KsPinDescriptor;
+}KSPIN_FACTORY;
+
+typedef struct
+{
     ULONG InterfaceCount;
     GUID *Interfaces;
+    KSPIN_FACTORY Factory;
 }SUBDEVICE_DESCRIPTOR, *PSUBDEVICE_DESCRIPTOR;
 
 #undef INTERFACE

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c?rev=39605&r1=39604&r2=39605&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c [iso-8859-1] Sun Feb 15 07:29:01 2009
@@ -120,7 +120,7 @@
     KIRQL OldIrql;
     IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
 
-    DPRINT1("IInterruptSync_fnCallSynchronizedRoutine This %p Routine %p DynamicContext %p\n", This, Routine, DynamicContext);
+    DPRINT1("IInterruptSync_fnCallSynchronizedRoutine This %p Routine %p DynamicContext %p Irql %x Interrupt %p\n", This, Routine, DynamicContext, KeGetCurrentIrql(), This->Interrupt);
 
     if (!This->Interrupt)
     {
@@ -140,7 +140,10 @@
     This->SyncRoutine = Routine;
     This->DynamicContext = DynamicContext;
 
-    return KeSynchronizeExecution(This->Interrupt, IInterruptSynchronizedRoutine, (PVOID)This);
+    if (KeSynchronizeExecution(This->Interrupt, IInterruptSynchronizedRoutine, (PVOID)This))
+        return STATUS_SUCCESS;
+    else
+        return STATUS_UNSUCCESSFUL;
 }
 
 NTAPI

Added: 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=39605&view=auto
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c (added)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c [iso-8859-1] Sun Feb 15 07:29:01 2009
@@ -1,0 +1,486 @@
+#include "private.h"
+
+typedef struct
+{
+    IPortPinWaveCyclicVtbl *lpVtbl;
+    IServiceSinkVtbl *lpVtblServiceSink;
+
+    LONG ref;
+    IPortWaveCyclic * Port;
+    IPortFilterWaveCyclic * Filter;
+    KSPIN_DESCRIPTOR * KsPinDescriptor;
+
+}IPortPinWaveCyclicImpl;
+
+//==================================================================================================================================
+
+static
+NTSTATUS
+NTAPI
+IServiceSink_fnQueryInterface(
+    IServiceSink* iface,
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortPinWaveCyclicImpl, lpVtblServiceSink);
+
+    DPRINT("IServiceSink_fnQueryInterface entered\n");
+
+    if (IsEqualGUIDAligned(refiid, &IID_IServiceSink) ||
+        IsEqualGUIDAligned(refiid, &IID_IUnknown))
+    {
+        *Output = &This->lpVtblServiceSink;
+        InterlockedIncrement(&This->ref);
+        return STATUS_SUCCESS;
+    }
+    return STATUS_UNSUCCESSFUL;
+}
+
+static
+ULONG
+NTAPI
+IServiceSink_fnAddRef(
+    IServiceSink* iface)
+{
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortPinWaveCyclicImpl, lpVtblServiceSink);
+    DPRINT("IServiceSink_fnAddRef entered\n");
+
+    return InterlockedIncrement(&This->ref);
+}
+
+static
+ULONG
+NTAPI
+IServiceSink_fnRelease(
+    IServiceSink* iface)
+{
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortPinWaveCyclicImpl, lpVtblServiceSink);
+
+    InterlockedDecrement(&This->ref);
+
+    DPRINT("IServiceSink_fnRelease entered %u\n", This->ref);
+
+    if (This->ref == 0)
+    {
+        FreeItem(This, TAG_PORTCLASS);
+        return 0;
+    }
+    /* Return new reference count */
+    return This->ref;
+}
+
+static
+VOID
+NTAPI
+IServiceSink_fnRequestService(
+    IServiceSink* iface)
+{
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortPinWaveCyclicImpl, lpVtblServiceSink);
+
+    DPRINT("IServiceSink_fnRequestService entered %p\n", This);
+}
+
+static IServiceSinkVtbl vt_IServiceSink = 
+{
+    IServiceSink_fnQueryInterface,
+    IServiceSink_fnAddRef,
+    IServiceSink_fnRelease,
+    IServiceSink_fnRequestService
+};
+
+//==================================================================================================================================
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnQueryInterface(
+    IPortPinWaveCyclic* iface,
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)iface;
+
+    if (IsEqualGUIDAligned(refiid, &IID_IIrpTarget) || 
+        //IsEqualGUIDAligned(refiid, &IID_IPortPinWaveCyclic) ||
+        IsEqualGUIDAligned(refiid, &IID_IUnknown))
+    {
+        *Output = &This->lpVtbl;
+        InterlockedIncrement(&This->ref);
+        return STATUS_SUCCESS;
+    }
+
+    return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+IPortPinWaveCyclic_fnAddRef(
+    IPortPinWaveCyclic* iface)
+{
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)iface;
+
+    return InterlockedIncrement(&This->ref);
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+IPortPinWaveCyclic_fnRelease(
+    IPortPinWaveCyclic* iface)
+{
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)iface;
+
+    InterlockedDecrement(&This->ref);
+
+    if (This->ref == 0)
+    {
+        FreeItem(This, TAG_PORTCLASS);
+        return 0;
+    }
+    return This->ref;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnNewIrpTarget(
+    IN IPortPinWaveCyclic* iface,
+    OUT struct IIrpTarget **OutTarget,
+    IN WCHAR * Name,
+    IN PUNKNOWN Unknown,
+    IN POOL_TYPE PoolType,
+    IN PDEVICE_OBJECT * DeviceObject,
+    IN PIRP Irp,
+    IN KSOBJECT_CREATE *CreateObject)
+{
+
+    return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnDeviceIoControl(
+    IN IPortPinWaveCyclic* iface,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    PIO_STACK_LOCATION IoStack;
+
+    UNIMPLEMENTED
+
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
+    {
+        /// FIXME
+        /// handle property event
+    }
+    else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT)
+    {
+        /// FIXME
+        /// handle enable event
+    }
+    else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_DISABLE_EVENT)
+    {
+        /// FIXME
+        /// handle disable event
+    }
+    else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_RESET_STATE)
+    {
+        /// FIXME
+        /// handle reset state
+    }
+    else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM || IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_READ_STREAM)
+    {
+        /// FIXME
+        /// handle reset state
+    }
+    else
+    {
+        return KsDefaultDeviceIoCompletion(DeviceObject, Irp);
+    }
+
+    return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnRead(
+    IN IPortPinWaveCyclic* iface,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnWrite(
+    IN IPortPinWaveCyclic* iface,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnFlush(
+    IN IPortPinWaveCyclic* iface,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnClose(
+    IN IPortPinWaveCyclic* iface,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+
+    return STATUS_UNSUCCESSFUL;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnQuerySecurity(
+    IN IPortPinWaveCyclic* iface,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnSetSecurity(
+    IN IPortPinWaveCyclic* iface,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnFastDeviceIoControl(
+    IN IPortPinWaveCyclic* iface,
+    IN PFILE_OBJECT FileObject,
+    IN BOOLEAN Wait,
+    IN PVOID InputBuffer,
+    IN ULONG InputBufferLength,
+    OUT PVOID OutputBuffer,
+    IN ULONG OutputBufferLength,
+    IN ULONG IoControlCode,
+    OUT PIO_STATUS_BLOCK StatusBlock,
+    IN PDEVICE_OBJECT DeviceObject)
+{
+
+    return STATUS_SUCCESS;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnFastRead(
+    IN IPortPinWaveCyclic* iface,
+    IN PFILE_OBJECT FileObject,
+    IN PLARGE_INTEGER FileOffset,
+    IN ULONG Length,
+    IN BOOLEAN Wait,
+    IN ULONG LockKey,
+    IN PVOID Buffer,
+    OUT PIO_STATUS_BLOCK StatusBlock,
+    IN PDEVICE_OBJECT DeviceObject)
+{
+    return STATUS_SUCCESS;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnFastWrite(
+    IN IPortPinWaveCyclic* iface,
+    IN PFILE_OBJECT FileObject,
+    IN PLARGE_INTEGER FileOffset,
+    IN ULONG Length,
+    IN BOOLEAN Wait,
+    IN ULONG LockKey,
+    IN PVOID Buffer,
+    OUT PIO_STATUS_BLOCK StatusBlock,
+    IN PDEVICE_OBJECT DeviceObject)
+{
+    return STATUS_SUCCESS;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+IPortPinWaveCyclic_fnInit(
+    IN IPortPinWaveCyclic* iface,
+    IN PPORTWAVECYCLIC Port,
+    IN PPORTFILTERWAVECYCLIC Filter,
+    IN KSPIN_CONNECT * ConnectDetails,
+    IN KSPIN_DESCRIPTOR * KsPinDescriptor)
+{
+    IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)iface;
+
+    Port->lpVtbl->AddRef(Port);
+    Filter->lpVtbl->AddRef(Filter);
+
+    This->Port = Port;
+    This->Filter = Filter;
+    This->KsPinDescriptor = KsPinDescriptor;
+
+    return STATUS_SUCCESS;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+IPortPinWaveCyclic_fnGetCompletedPosition(
+    IN IPortPinWaveCyclic* iface)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+IPortPinWaveCyclic_fnGetCycleCount(
+    IN IPortPinWaveCyclic* iface)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+IPortPinWaveCyclic_fnGetDeviceBufferSize(
+    IN IPortPinWaveCyclic* iface)
+{
+    UNIMPLEMENTED;
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+PVOID
+NTAPI
+IPortPinWaveCyclic_fnGetIrpStream(
+    IN IPortPinWaveCyclic* iface)
+{
+    UNIMPLEMENTED;
+    return NULL;
+}
+
+
+/*
+ * @implemented
+ */
+PMINIPORT
+NTAPI
+IPortPinWaveCyclic_fnGetMiniport(
+    IN IPortPinWaveCyclic* iface)
+{
+    UNIMPLEMENTED;
+    return NULL;
+}
+
+static IPortPinWaveCyclicVtbl vt_IPortPinWaveCyclic =
+{
+    IPortPinWaveCyclic_fnQueryInterface,
+    IPortPinWaveCyclic_fnAddRef,
+    IPortPinWaveCyclic_fnRelease,
+    IPortPinWaveCyclic_fnNewIrpTarget,
+    IPortPinWaveCyclic_fnDeviceIoControl,
+    IPortPinWaveCyclic_fnRead,
+    IPortPinWaveCyclic_fnWrite,
+    IPortPinWaveCyclic_fnFlush,
+    IPortPinWaveCyclic_fnClose,
+    IPortPinWaveCyclic_fnQuerySecurity,
+    IPortPinWaveCyclic_fnSetSecurity,
+    IPortPinWaveCyclic_fnFastDeviceIoControl,
+    IPortPinWaveCyclic_fnFastRead,
+    IPortPinWaveCyclic_fnFastWrite,
+    IPortPinWaveCyclic_fnInit,
+    IPortPinWaveCyclic_fnGetCompletedPosition,
+    IPortPinWaveCyclic_fnGetCycleCount,
+    IPortPinWaveCyclic_fnGetDeviceBufferSize,
+    IPortPinWaveCyclic_fnGetIrpStream,
+    IPortPinWaveCyclic_fnGetMiniport
+};
+
+
+
+
+NTSTATUS NewPortPinWaveCyclic(
+    OUT IPortPinWaveCyclic ** OutPin)
+{
+    IPortPinWaveCyclicImpl * This;
+
+    This = AllocateItem(NonPagedPool, sizeof(IPortPinWaveCyclicImpl), TAG_PORTCLASS);
+    if (!This)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* initialize IPortPinWaveCyclic */
+    This->ref = 1;
+    This->lpVtbl = &vt_IPortPinWaveCyclic;
+    This->lpVtblServiceSink = &vt_IServiceSink;
+
+
+    /* store result */
+    *OutPin = (IPortPinWaveCyclic*)&This->lpVtbl;
+
+    return STATUS_SUCCESS;
+}

Propchange: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c?rev=39605&r1=39604&r2=39605&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c [iso-8859-1] Sun Feb 15 07:29:01 2009
@@ -22,5 +22,5 @@
     IN ULONG Tag)
 {
 
-    //ExFreePoolWithTag(Item, Tag);
+    ExFreePoolWithTag(Item, Tag);
 }

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c?rev=39605&r1=39604&r2=39605&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c [iso-8859-1] Sun Feb 15 07:29:01 2009
@@ -97,7 +97,7 @@
     IPortEvents* iface)
 {
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortWaveCyclicImpl, lpVtblPortEvents);
-    DPRINT1("IPortEvents_fnQueryInterface entered\n");
+    DPRINT1("IPortEvents_fnRelease entered\n");
     InterlockedDecrement(&This->ref);
 
     if (This->ref == 0)
@@ -272,7 +272,7 @@
     PPOWERNOTIFY PowerNotify;
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
 
-    DPRINT1("IPortWaveCyclic_Init entered\n");
+    DPRINT1("IPortWaveCyclic_Init entered %p\n", This);
 
     if (This->bInitialized)
     {
@@ -537,12 +537,21 @@
     IN PUNKNOWN Unknown,
     IN POOL_TYPE PoolType,
     IN PDEVICE_OBJECT * DeviceObject,
-    IN PIRP Irp, 
+    IN PIRP Irp,
     IN KSOBJECT_CREATE *CreateObject)
 {
+    NTSTATUS Status;
+    IPortFilterWaveCyclic * Filter;
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortWaveCyclicImpl, lpVtblSubDevice);
 
     DPRINT1("ISubDevice_NewIrpTarget this %p\n", This);
+
+    Status = NewPortFilterWaveCyclic(&Filter, (IPortWaveCyclic*)This);
+    if (NT_SUCCESS(Status))
+    {
+        *OutTarget = (IIrpTarget*)Filter;
+    }
+
     return STATUS_UNSUCCESSFUL;
 }
 
@@ -567,9 +576,11 @@
 {
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortWaveCyclicImpl, lpVtblSubDevice);
 
+    ASSERT(This->SubDeviceDescriptor != NULL);
+
     *Descriptor = This->SubDeviceDescriptor;
 
-    DPRINT1("ISubDevice_GetDescriptor this %p\n", This);
+    DPRINT1("ISubDevice_GetDescriptor this %p desc %p\n", This, This->SubDeviceDescriptor);
     return STATUS_SUCCESS;
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild?rev=39605&r1=39604&r2=39605&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild [iso-8859-1] Sun Feb 15 07:29:01 2009
@@ -26,6 +26,7 @@
 	<file>resource.c</file>
 	<file>registry.c</file>
 	<file>service_group.c</file>
+	<file>pin_wavecyclic.c</file>
 	<file>pool.c</file>
 	<file>port.c</file>
 	<file>power.c</file>

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=39605&r1=39604&r2=39605&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] Sun Feb 15 07:29:01 2009
@@ -83,7 +83,11 @@
     OUT PPORTCLSVERSION * OutVersion);
 
 NTSTATUS NewPortFilterWaveCyclic(
-    OUT IPortFilterWaveCyclic ** OutFilter);
+    OUT IPortFilterWaveCyclic ** OutFilter,
+    IN IPortWaveCyclic* iface);
+
+NTSTATUS NewPortPinWaveCyclic(
+    OUT IPortPinWaveCyclic ** OutPin);
 
 PVOID AllocateItem(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag);
 
@@ -179,6 +183,13 @@
 
 NTSTATUS
 NTAPI
+PcValidateConnectRequest(
+    IN PIRP Irp,
+    IN KSPIN_FACTORY * Descriptor,
+    OUT PKSPIN_CONNECT* Connect);
+
+NTSTATUS
+NTAPI
 PcCreateItemDispatch(
     IN  PDEVICE_OBJECT DeviceObject,
     IN  PIRP Irp);

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c?rev=39605&r1=39604&r2=39605&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c [iso-8859-1] Sun Feb 15 07:29:01 2009
@@ -37,7 +37,8 @@
 {
     IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
     if (IsEqualGUIDAligned(refiid, &IID_IServiceGroup) ||
-        IsEqualGUIDAligned(refiid, &IID_IServiceSink))
+        IsEqualGUIDAligned(refiid, &IID_IServiceSink) ||
+        IsEqualGUIDAligned(refiid, &IID_IUnknown))
     {
         *Output = &This->lpVtbl;
         InterlockedIncrement(&This->ref);

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.c?rev=39605&r1=39604&r2=39605&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.c [iso-8859-1] Sun Feb 15 07:29:01 2009
@@ -102,6 +102,7 @@
     IN PPCFILTER_DESCRIPTOR FilterDescription)
 {
     SUBDEVICE_DESCRIPTOR * Descriptor;
+    ULONG Index;
     NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES;
 
     Descriptor = AllocateItem(NonPagedPool, sizeof(SUBDEVICE_DESCRIPTOR), TAG_PORTCLASS);
@@ -116,6 +117,24 @@
     RtlCopyMemory(Descriptor->Interfaces, InterfaceGuids, sizeof(GUID) * InterfaceCount);
     Descriptor->InterfaceCount = InterfaceCount;
 
+
+    if (FilterDescription->PinCount)
+    {
+        /// FIXME
+        /// handle extra size
+        ASSERT(FilterDescription->PinSize == sizeof(KSPIN_DESCRIPTOR));
+        Descriptor->Factory.KsPinDescriptor = AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR) * FilterDescription->PinCount, TAG_PORTCLASS);
+        if (!Descriptor->Factory.KsPinDescriptor)
+            goto cleanup;
+
+        Descriptor->Factory.PinDescriptorCount = FilterDescription->PinCount;
+        Descriptor->Factory.PinDescriptorSize = FilterDescription->PinSize;
+
+        /* copy pin factories */
+        for(Index = 0; Index < FilterDescription->PinCount; Index++)
+            RtlMoveMemory(&Descriptor->Factory.KsPinDescriptor[Index], &FilterDescription->Pins[Index].KsPinDescriptor, sizeof(KSPIN_DESCRIPTOR));
+    }
+
     *OutSubdeviceDescriptor = Descriptor;
     return STATUS_SUCCESS;
 
@@ -125,10 +144,28 @@
         if (Descriptor->Interfaces)
             FreeItem(Descriptor->Interfaces, TAG_PORTCLASS);
 
+        if (Descriptor->Factory.KsPinDescriptor)
+            FreeItem(Descriptor->Factory.KsPinDescriptor, TAG_PORTCLASS);
+
         FreeItem(Descriptor, TAG_PORTCLASS);
     }
     return Status;
 }
+
+/*
+ * @implemented
+ */
+
+NTSTATUS
+NTAPI
+PcValidateConnectRequest(
+    IN PIRP Irp,
+    IN KSPIN_FACTORY * Factory,
+    OUT PKSPIN_CONNECT * Connect)
+{
+    return KsValidateConnectRequest(Irp, Factory->PinDescriptorCount, Factory->KsPinDescriptor, Connect);
+}
+
 
 /* PcDeleteSubdeviceDescriptor */
 



More information about the Ros-diffs mailing list