diff --git a/reactos/drivers/wdm/audio/backpln/portcls/api.c b/reactos/drivers/wdm/audio/backpln/portcls/api.c
index 6993ac3ef9b..674c6b204b3 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/api.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/api.c
@@ -95,6 +95,7 @@ PcDmaMasterDescription(
RtlZeroMemory(DeviceDescription, sizeof(DEVICE_DESCRIPTION));
DeviceDescription->Master = TRUE;
+ DeviceDescription->Version = DEVICE_DESCRIPTION_VERSION1;
DeviceDescription->ScatterGather= ScatterGather;
DeviceDescription->Dma32BitAddresses = Dma32BitAddresses;
DeviceDescription->IgnoreCount = IgnoreCount;
@@ -124,6 +125,7 @@ PcDmaSlaveDescription(
RtlZeroMemory(DeviceDescription, sizeof(DEVICE_DESCRIPTION));
+ DeviceDescription->Version = DEVICE_DESCRIPTION_VERSION1;
DeviceDescription->DemandMode = DemandMode;
DeviceDescription->AutoInitialize = AutoInitialize;
DeviceDescription->DmaSpeed = DmaSpeed;
@@ -132,3 +134,4 @@ PcDmaSlaveDescription(
return STATUS_SUCCESS;
}
+
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c b/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c
new file mode 100644
index 00000000000..0e52bc54493
--- /dev/null
+++ b/reactos/drivers/wdm/audio/backpln/portcls/dispatcher.c
@@ -0,0 +1,258 @@
+#include "private.h"
+
+NTSTATUS
+NTAPI
+Dispatch_fnDeviceIoControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ IIrpTarget * IrpTarget;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+
+ DPRINT1("Dispatch_fnDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject);
+
+ /* access the create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT(IoStack->FileObject);
+
+ IrpTarget = (IIrpTarget*)CreateItem->Context;
+
+ return IrpTarget->lpVtbl->DeviceIoControl(IrpTarget, DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+Dispatch_fnRead(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ IIrpTarget * IrpTarget;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+
+ DPRINT1("Dispatch_fnRead called DeviceObject %p Irp %p\n", DeviceObject);
+
+ /* access the create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT(IoStack->FileObject);
+
+ IrpTarget = (IIrpTarget*)CreateItem->Context;
+
+ return IrpTarget->lpVtbl->Read(IrpTarget, DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+Dispatch_fnWrite(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ IIrpTarget * IrpTarget;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+
+ DPRINT1("Dispatch_fnWrite called DeviceObject %p Irp %p\n", DeviceObject);
+
+ /* access the create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT(IoStack->FileObject);
+
+ IrpTarget = (IIrpTarget*)CreateItem->Context;
+
+ return IrpTarget->lpVtbl->Write(IrpTarget, DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+Dispatch_fnFlush(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ IIrpTarget * IrpTarget;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+
+ DPRINT1("Dispatch_fnFlush called DeviceObject %p Irp %p\n", DeviceObject);
+
+ /* access the create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT(IoStack->FileObject);
+
+ IrpTarget = (IIrpTarget*)CreateItem->Context;
+
+ return IrpTarget->lpVtbl->Flush(IrpTarget, DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+Dispatch_fnClose(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ IIrpTarget * IrpTarget;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+
+ DPRINT1("Dispatch_fnClose called DeviceObject %p Irp %p\n", DeviceObject);
+
+ /* access the create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+ ASSERT(CreateItem != NULL);
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT(IoStack != NULL);
+ ASSERT(IoStack->FileObject != NULL);
+
+ IrpTarget = (IIrpTarget*)CreateItem->Context;
+
+ DPRINT1("IrpTarget %p\n", IrpTarget);
+
+ return IrpTarget->lpVtbl->Close(IrpTarget, DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+Dispatch_fnQuerySecurity(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ IIrpTarget * IrpTarget;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+
+ DPRINT1("Dispatch_fnQuerySecurity called DeviceObject %p Irp %p\n", DeviceObject);
+
+ /* access the create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT(IoStack->FileObject);
+
+ IrpTarget = (IIrpTarget*)CreateItem->Context;
+
+ return IrpTarget->lpVtbl->QuerySecurity(IrpTarget, DeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+Dispatch_fnSetSecurity(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ IIrpTarget * IrpTarget;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+
+ DPRINT1("Dispatch_fnSetSecurity called DeviceObject %p Irp %p\n", DeviceObject);
+
+ /* access the create item */
+ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
+
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT(IoStack->FileObject);
+
+ IrpTarget = (IIrpTarget*)CreateItem->Context;
+
+ return IrpTarget->lpVtbl->SetSecurity(IrpTarget, DeviceObject, Irp);
+}
+
+BOOLEAN
+NTAPI
+Dispatch_fnFastDeviceIoControl(
+ PFILE_OBJECT FileObject,
+ BOOLEAN Wait,
+ PVOID InputBuffer,
+ ULONG InputBufferLength,
+ PVOID OutputBuffer,
+ ULONG OutputBufferLength,
+ ULONG IoControlCode,
+ PIO_STATUS_BLOCK IoStatus,
+ PDEVICE_OBJECT DeviceObject)
+{
+ DPRINT1("Dispatch_fnFastDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject);
+
+
+ return FALSE;
+}
+
+
+BOOLEAN
+NTAPI
+Dispatch_fnFastRead(
+ PFILE_OBJECT FileObject,
+ PLARGE_INTEGER FileOffset,
+ ULONG Length,
+ BOOLEAN Wait,
+ ULONG LockKey,
+ PVOID Buffer,
+ PIO_STATUS_BLOCK IoStatus,
+ PDEVICE_OBJECT DeviceObject)
+{
+ DPRINT1("Dispatch_fnFastRead called DeviceObject %p Irp %p\n", DeviceObject);
+
+ return FALSE;
+
+}
+
+BOOLEAN
+NTAPI
+Dispatch_fnFastWrite(
+ PFILE_OBJECT FileObject,
+ PLARGE_INTEGER FileOffset,
+ ULONG Length,
+ BOOLEAN Wait,
+ ULONG LockKey,
+ PVOID Buffer,
+ PIO_STATUS_BLOCK IoStatus,
+ PDEVICE_OBJECT DeviceObject)
+{
+ DPRINT1("Dispatch_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject);
+
+ return FALSE;
+}
+
+static KSDISPATCH_TABLE DispatchTable =
+{
+ Dispatch_fnDeviceIoControl,
+ Dispatch_fnRead,
+ Dispatch_fnWrite,
+ Dispatch_fnFlush,
+ Dispatch_fnClose,
+ Dispatch_fnQuerySecurity,
+ Dispatch_fnSetSecurity,
+ Dispatch_fnFastDeviceIoControl,
+ Dispatch_fnFastRead,
+ Dispatch_fnFastWrite,
+};
+
+
+NTSTATUS
+NTAPI
+NewDispatchObject(
+ IN PIRP Irp,
+ IN IIrpTarget * Target)
+{
+ NTSTATUS Status;
+ KSOBJECT_HEADER ObjectHeader;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+
+ CreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM), TAG_PORTCLASS);
+ if (!CreateItem)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ CreateItem->Context = (PVOID)Target;
+
+ Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
+ DPRINT1("KsAllocateObjectHeader result %x\n", Status);
+ return Status;
+}
+
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c b/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c
index ef3232cca25..513eebbc809 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c
@@ -1,8 +1,5 @@
#include "private.h"
-
-
-
typedef struct
{
IDrmPort2Vtbl *lpVtbl;
@@ -46,6 +43,7 @@ IDrmPort2_fnQueryInterface(
IN REFIID refiid,
OUT PVOID* Output)
{
+ WCHAR Buffer[100];
IDrmPort2Impl * This = (IDrmPort2Impl*)iface;
if (IsEqualGUIDAligned(refiid, &IID_IDrmPort) ||
@@ -57,7 +55,9 @@ IDrmPort2_fnQueryInterface(
return STATUS_SUCCESS;
}
- DPRINT("IDrmPort2_QueryInterface: This %p unknown iid\n", This, This->ref);
+ StringFromCLSID(refiid, Buffer);
+ DPRINT1("IDrmPort2_QueryInterface no interface!!! iface %S\n", Buffer);
+ KeBugCheckEx(0, 0, 0, 0, 0);
return STATUS_UNSUCCESSFUL;
}
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
index 968ab0a6718..52d6fa36cdb 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
@@ -79,7 +79,7 @@ IPortFilterWaveCyclic_fnNewIrpTarget(
IN WCHAR * Name,
IN PUNKNOWN Unknown,
IN POOL_TYPE PoolType,
- IN PDEVICE_OBJECT * DeviceObject,
+ IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN KSOBJECT_CREATE *CreateObject)
{
@@ -284,6 +284,26 @@ IPortFilterWaveCyclic_fnFastWrite(
return STATUS_SUCCESS;
}
+/*
+ * @implemented
+ */
+static
+NTSTATUS
+NTAPI
+IPortFilterWaveCyclic_fnInit(
+ IN IPortFilterWaveCyclic* iface,
+ IN IPortWaveCyclic* Port)
+{
+ IPortFilterWaveCyclicImpl * This = (IPortFilterWaveCyclicImpl*)iface;
+
+ This->Port = Port;
+
+ /* increment reference count */
+ iface->lpVtbl->AddRef(iface);
+
+ return STATUS_SUCCESS;
+}
+
static IPortFilterWaveCyclicVtbl vt_IPortFilterWaveCyclic =
{
IPortFilterWaveCyclic_fnQueryInterface,
@@ -299,13 +319,13 @@ static IPortFilterWaveCyclicVtbl vt_IPortFilterWaveCyclic =
IPortFilterWaveCyclic_fnSetSecurity,
IPortFilterWaveCyclic_fnFastDeviceIoControl,
IPortFilterWaveCyclic_fnFastRead,
- IPortFilterWaveCyclic_fnFastWrite
+ IPortFilterWaveCyclic_fnFastWrite,
+ IPortFilterWaveCyclic_fnInit
};
-
-NTSTATUS NewPortFilterWaveCyclic(
- OUT IPortFilterWaveCyclic ** OutFilter,
- IN IPortWaveCyclic* iface)
+NTSTATUS
+NewPortFilterWaveCyclic(
+ OUT IPortFilterWaveCyclic ** OutFilter)
{
IPortFilterWaveCyclicImpl * This;
@@ -316,10 +336,6 @@ NTSTATUS NewPortFilterWaveCyclic(
/* 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;
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/guids.c b/reactos/drivers/wdm/audio/backpln/portcls/guids.c
index 725376d666a..4b19072e4be 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/guids.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/guids.c
@@ -43,6 +43,9 @@ const GUID IID_IPortClsVersion = {0x7D89A7BBL, 0x869B, 0x4567, {0x8D, 0xBE, 0x1E
const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46}};
const GUID IID_IPortEvents = {0xA80F29C4L, 0x5498, 0x11D2, {0x95, 0xD9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}};
+const GUID KSNAME_PIN = {0x146F1A80, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+
+
//FIXME
//
const GUID KS_CATEGORY_AUDIO = {0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
@@ -52,9 +55,11 @@ const GUID KS_CATEGORY_TOPOLOGY = {0xDDA54A40, 0x1E4C, 0x11D1, {0xA0, 0x50, 0x40
const GUID KSDATAFORMAT_TYPE_AUDIO = {0x73647561L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
-const GUID KSDATAFORMAT_SUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
+const GUID KSDATAFORMAT_SUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
const GUID KSDATAFORMAT_SPECIFIER_WAVEFORMATEX = {0x05589f81L, 0xc356, 0x11ce, {0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a}};
+const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
///
/// undocumented guids
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
index 0c39d70d7de..a5634f34486 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
+++ b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
@@ -17,7 +17,7 @@ DEFINE_GUID(IID_IIrpTargetFactory, 0xB4C90A62, 0x5791, 0x11D0, 0xF9, 0x86, 0x00,
IN WCHAR * Name, \
IN PUNKNOWN Unknown, \
IN POOL_TYPE PoolType, \
- IN PDEVICE_OBJECT * DeviceObject, \
+ IN PDEVICE_OBJECT DeviceObject, \
IN PIRP Irp, \
IN KSOBJECT_CREATE *CreateObject) PURE; \
\
@@ -104,11 +104,19 @@ typedef struct
KSPIN_DESCRIPTOR * KsPinDescriptor;
}KSPIN_FACTORY;
+typedef struct
+{
+ ULONG MaxKsPropertySetCount;
+ ULONG FreeKsPropertySetOffset;
+ PKSPROPERTY_SET Properties;
+}KSPROPERTY_SET_LIST;
+
typedef struct
{
ULONG InterfaceCount;
GUID *Interfaces;
KSPIN_FACTORY Factory;
+ KSPROPERTY_SET_LIST FilterPropertySet;
}SUBDEVICE_DESCRIPTOR, *PSUBDEVICE_DESCRIPTOR;
#undef INTERFACE
@@ -128,7 +136,7 @@ DECLARE_INTERFACE_(ISubdevice, IUnknown)
IN WCHAR * Name,
IN PUNKNOWN Unknown,
IN POOL_TYPE PoolType,
- IN PDEVICE_OBJECT * DeviceObject,
+ IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN KSOBJECT_CREATE *CreateObject) PURE;
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
index a85edf99345..1595c2a1d72 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
@@ -157,11 +157,11 @@ IPortPinWaveCyclic_fnNewIrpTarget(
IN WCHAR * Name,
IN PUNKNOWN Unknown,
IN POOL_TYPE PoolType,
- IN PDEVICE_OBJECT * DeviceObject,
+ IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN KSOBJECT_CREATE *CreateObject)
{
-
+ DPRINT1("IPortPinWaveCyclic_fnNewIrpTarget\n");
return STATUS_UNSUCCESSFUL;
}
@@ -181,6 +181,7 @@ IPortPinWaveCyclic_fnDeviceIoControl(
IoStack = IoGetCurrentIrpStackLocation(Irp);
+ DPRINT1("IPortPinWaveCyclic_fnDeviceIoControl\n");
if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
{
/// FIXME
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_midi.c b/reactos/drivers/wdm/audio/backpln/portcls/port_midi.c
index 2d72ecb418d..7fcfe5dfbd2 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_midi.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_midi.c
@@ -330,7 +330,7 @@ ISubDevice_fnNewIrpTarget(
IN WCHAR * Name,
IN PUNKNOWN Unknown,
IN POOL_TYPE PoolType,
- IN PDEVICE_OBJECT * DeviceObject,
+ IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN KSOBJECT_CREATE *CreateObject)
{
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
index fdef7f6b3af..8a6931e48ba 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
@@ -316,7 +316,7 @@ ISubDevice_fnNewIrpTarget(
IN WCHAR * Name,
IN PUNKNOWN Unknown,
IN POOL_TYPE PoolType,
- IN PDEVICE_OBJECT * DeviceObject,
+ IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN KSOBJECT_CREATE *CreateObject)
{
@@ -432,152 +432,6 @@ static ISubdeviceVtbl vt_ISubdeviceVtbl =
ISubDevice_fnPinCount
};
-
-NTSTATUS
-NTAPI
-ITopology_fnDeviceIoControl(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- DPRINT1("ITopology_fnDeviceIoControl called\n");
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-ITopology_fnRead(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- DPRINT1("ITopology_fnRead called\n");
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-ITopology_fnWrite(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- DPRINT1("ITopology_fnWrite called\n");
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-ITopology_fnFlush(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- DPRINT1("ITopology_fnFlush called\n");
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-ITopology_fnClose(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- DPRINT1("ITopology_fnClose called\n");
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-ITopology_fnQuerySecurity(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- DPRINT1("ITopology_fnQuerySecurity called\n");
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-ITopology_fnSetSecurity(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- DPRINT1("ITopology_fnSetSecurity called\n");
-
- return STATUS_SUCCESS;
-}
-
-BOOLEAN
-NTAPI
-ITopology_fnFastDeviceIoControl(
- PFILE_OBJECT FileObject,
- BOOLEAN Wait,
- PVOID InputBuffer,
- ULONG InputBufferLength,
- PVOID OutputBuffer,
- ULONG OutputBufferLength,
- ULONG IoControlCode,
- PIO_STATUS_BLOCK IoStatus,
- PDEVICE_OBJECT DeviceObject)
-{
- DPRINT1("ITopology_fnFastDeviceIoControl called\n");
-
- return TRUE;
-}
-
-
-BOOLEAN
-NTAPI
-ITopology_fnFastRead(
- PFILE_OBJECT FileObject,
- PLARGE_INTEGER FileOffset,
- ULONG Length,
- BOOLEAN Wait,
- ULONG LockKey,
- PVOID Buffer,
- PIO_STATUS_BLOCK IoStatus,
- PDEVICE_OBJECT DeviceObject)
-{
- DPRINT1("ITopology_fnFastRead called\n");
-
- return TRUE;
-
-}
-
-BOOLEAN
-NTAPI
-ITopology_fnFastWrite(
- PFILE_OBJECT FileObject,
- PLARGE_INTEGER FileOffset,
- ULONG Length,
- BOOLEAN Wait,
- ULONG LockKey,
- PVOID Buffer,
- PIO_STATUS_BLOCK IoStatus,
- PDEVICE_OBJECT DeviceObject)
-{
- DPRINT1("ITopology_fnFastWrite called\n");
-
- return TRUE;
-}
-
-static KSDISPATCH_TABLE DispatchTable =
-{
- ITopology_fnDeviceIoControl,
- ITopology_fnRead,
- ITopology_fnWrite,
- ITopology_fnFlush,
- ITopology_fnClose,
- ITopology_fnQuerySecurity,
- ITopology_fnSetSecurity,
- ITopology_fnFastDeviceIoControl,
- ITopology_fnFastRead,
- ITopology_fnFastWrite,
-};
-
NTSTATUS
NTAPI
PcCreateItemDispatch(
@@ -585,21 +439,21 @@ PcCreateItemDispatch(
IN PIRP Irp)
{
NTSTATUS Status = STATUS_SUCCESS;
-
+ PIO_STACK_LOCATION IoStack;
ISubdevice * SubDevice;
PPCLASS_DEVICE_EXTENSION DeviceExt;
SUBDEVICE_ENTRY * Entry;
+ IIrpTarget *Filter, *Pin;
PKSOBJECT_CREATE_ITEM CreateItem;
- DPRINT1("PcCreateItemDispatch called\n");
+ DPRINT1("PcCreateItemDispatch called DeviceObject %p\n", DeviceObject);
/* access the create item */
CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
if (!CreateItem)
{
DPRINT1("PcCreateItemDispatch no CreateItem\n");
- Status = STATUS_UNSUCCESSFUL;
- goto cleanup;
+ return STATUS_UNSUCCESSFUL;
}
SubDevice = (ISubdevice*)CreateItem->Context;
@@ -608,20 +462,17 @@ PcCreateItemDispatch(
if (!SubDevice || !DeviceExt)
{
DPRINT1("PcCreateItemDispatch SubDevice %p DeviceExt %p\n", SubDevice, DeviceExt);
-
- Status = STATUS_UNSUCCESSFUL;
- goto cleanup;
+ return STATUS_UNSUCCESSFUL;
}
Entry = AllocateItem(NonPagedPool, sizeof(SUBDEVICE_ENTRY), TAG_PORTCLASS);
if (!Entry)
{
DPRINT1("PcCreateItemDispatch no memory\n");
-
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto cleanup;
+ return STATUS_INSUFFICIENT_RESOURCES;
}
-#if 0
+
+#if KS_IMPLEMENTED
Status = KsReferenceSoftwareBusObject(DeviceExt->KsDeviceHeader);
if (!NT_SUCCESS(Status) && Status != STATUS_NOT_IMPLEMENTED)
{
@@ -632,24 +483,77 @@ PcCreateItemDispatch(
}
#endif
- Status = KsAllocateObjectHeader(&Entry->ObjectHeader, 0, NULL, Irp, &DispatchTable);
+
+ /* 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
+ */
+ Status = SubDevice->lpVtbl->NewIrpTarget(SubDevice,
+ &Filter,
+ NULL,
+ NULL,
+ NonPagedPool,
+ DeviceObject,
+ Irp,
+ NULL);
if (!NT_SUCCESS(Status))
{
- DPRINT1("KsAllocateObjectHeader failed with %x\n", Status);
- //KsDereferenceSoftwareBusObject(DeviceExt->KsDeviceHeader);
- FreeItem(Entry, TAG_PORTCLASS);
+ DPRINT1("Failed to get filter object\n");
return Status;
}
- InsertTailList(&DeviceExt->SubDeviceList, &Entry->Entry);
+ /* is just the filter requested */
+ if (IoStack->FileObject->FileName.Buffer == NULL)
+ {
+ /* create the dispatch object */
+ Status = NewDispatchObject(Irp, Filter);
+ DPRINT1("Filter %p\n", Filter);
+ DbgBreakPoint();
+ }
+ else
+ {
+ KSOBJECT_CREATE Create;
+ LPWSTR Buffer = IoStack->FileObject->FileName.Buffer;
-cleanup:
- // Irp->IoStatus.Status = Status;
- // Irp->IoStatus.Information = 0;
- // IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}";
+
+ /* is the request for a new pin */
+ if (!wcsncmp(KS_NAME_PIN, Buffer, wcslen(KS_NAME_PIN)))
+ {
+ /* try to create new pin */
+ Create.CreateItemsCount = 1;
+ Create.CreateItemsList = (PKSOBJECT_CREATE_ITEM)(IoStack->FileObject->FileName.Buffer + (wcslen(KS_NAME_PIN) + 1));
+
+ Status = Filter->lpVtbl->NewIrpTarget(Filter,
+ &Pin,
+ KS_NAME_PIN,
+ NULL,
+ NonPagedPool,
+ DeviceObject,
+ Irp,
+ &Create);
+ if (NT_SUCCESS(Status))
+ {
+ /* create the dispatch object */
+ Status = NewDispatchObject(Irp, Pin);
+ DPRINT1("Pin %p\n", Pin);
+ }
+ }
+ }
- DPRINT1("PcCreateItemDispatch Status %x\n", Status);
return Status;
}
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
index e08f5b9861e..45a3c3f32dd 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
@@ -19,8 +19,11 @@ typedef struct
PPOWERNOTIFY pPowerNotify;
PPCFILTER_DESCRIPTOR pDescriptor;
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor;
+ IPortFilterWaveCyclic * Filter;
}IPortWaveCyclicImpl;
+GUID KSPROPERTY_SETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+
static GUID InterfaceGuids[3] =
{
{
@@ -37,6 +40,32 @@ static GUID InterfaceGuids[3] =
}
};
+DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWaveCyclicTopologySet, TopologyPropertyHandler);
+DEFINE_KSPROPERTY_PINSETCONSTRAINED(PortFilterWaveCyclicPinSet, PinPropertyHandler, PinPropertyHandler, PinPropertyHandler);
+
+KSPROPERTY_SET WaveCyclicPropertySet[] =
+{
+ {
+ &KSPROPSETID_Topology,
+ sizeof(PortFilterWaveCyclicTopologySet) / sizeof(KSPROPERTY_ITEM),
+ (const KSPROPERTY_ITEM*)&PortFilterWaveCyclicTopologySet,
+ 0,
+ NULL
+ },
+ {
+ &KSPROPSETID_Pin,
+ sizeof(PortFilterWaveCyclicPinSet) / sizeof(KSPROPERTY_ITEM),
+ (const KSPROPERTY_ITEM*)&PortFilterWaveCyclicPinSet,
+ 0,
+ NULL
+ }
+};
+
+//KSEVENTSETID_LoopedStreaming, Type = KSEVENT_LOOPEDSTREAMING_POSITION
+//KSEVENTSETID_Connection, Type = KSEVENT_CONNECTION_ENDOFSTREAM,
+
+
+
#if 0
static const KSIDENTIFIER Identifiers[] =
{
@@ -319,11 +348,11 @@ IPortWaveCyclic_fnInit(
/* create the subdevice descriptor */
Status = PcCreateSubdeviceDescriptor(&This->SubDeviceDescriptor,
3,
- InterfaceGuids,
- 0,
- NULL,
+ InterfaceGuids,
0,
NULL,
+ 2,
+ WaveCyclicPropertySet,
0,
0,
0,
@@ -536,7 +565,7 @@ ISubDevice_fnNewIrpTarget(
IN WCHAR * Name,
IN PUNKNOWN Unknown,
IN POOL_TYPE PoolType,
- IN PDEVICE_OBJECT * DeviceObject,
+ IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN KSOBJECT_CREATE *CreateObject)
{
@@ -546,13 +575,28 @@ ISubDevice_fnNewIrpTarget(
DPRINT1("ISubDevice_NewIrpTarget this %p\n", This);
- Status = NewPortFilterWaveCyclic(&Filter, (IPortWaveCyclic*)This);
- if (NT_SUCCESS(Status))
+ if (This->Filter)
{
- *OutTarget = (IIrpTarget*)Filter;
+ *OutTarget = (IIrpTarget*)This->Filter;
+ return STATUS_SUCCESS;
}
- return STATUS_UNSUCCESSFUL;
+
+ Status = NewPortFilterWaveCyclic(&Filter);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ Status = Filter->lpVtbl->Init(Filter, (IPortWaveCyclic*)This);
+ if (!NT_SUCCESS(Status))
+ {
+ Filter->lpVtbl->Release(Filter);
+ return Status;
+ }
+
+ *OutTarget = (IIrpTarget*)Filter;
+ return Status;
}
static
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
index 0611957fd3a..c0e58a1256c 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
@@ -613,7 +613,7 @@ ISubDevice_fnNewIrpTarget(
IN WCHAR * Name,
IN PUNKNOWN Unknown,
IN POOL_TYPE PoolType,
- IN PDEVICE_OBJECT * DeviceObject,
+ IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN KSOBJECT_CREATE *CreateObject)
{
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
index c4bf80ec342..8d6d321cfc7 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
+++ b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
@@ -12,6 +12,7 @@
libcntpr
api.c
connection.c
+ dispatcher.c
dll.c
dma_slave.c
drm_port.c
@@ -35,6 +36,7 @@
port_topology.c
port_wavepci.c
port_wavecyclic.c
+ propertyhandler.c
miniport.c
miniport_dmus.c
miniport_fmsynth.c
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h
index 295e37493ca..f6a5f40efec 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/private.h
+++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h
@@ -83,12 +83,17 @@ NTSTATUS NewPortClsVersion(
OUT PPORTCLSVERSION * OutVersion);
NTSTATUS NewPortFilterWaveCyclic(
- OUT IPortFilterWaveCyclic ** OutFilter,
- IN IPortWaveCyclic* iface);
+ OUT IPortFilterWaveCyclic ** OutFilter);
NTSTATUS NewPortPinWaveCyclic(
OUT IPortPinWaveCyclic ** OutPin);
+NTSTATUS
+NTAPI
+NewDispatchObject(
+ IN PIRP Irp,
+ IN IIrpTarget * Target);
+
PVOID AllocateItem(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag);
VOID
@@ -118,6 +123,19 @@ typedef struct
ULONG ToPin;
}PHYSICAL_CONNECTION;
+NTSTATUS
+NTAPI
+TopologyPropertyHandler(
+ IN PIRP Irp,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data);
+
+NTSTATUS
+NTAPI
+PinPropertyHandler(
+ IN PIRP Irp,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data);
typedef struct
{
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/registry.c b/reactos/drivers/wdm/audio/backpln/portcls/registry.c
index 681323d203d..8a5f4597ad8 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/registry.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/registry.c
@@ -64,6 +64,7 @@ IRegistryKey_fnQueryInterface(
}
DPRINT("IRegistryKey_QueryInterface: This %p unknown iid\n", This, This->ref);
+KeBugCheckEx(0,0,0,0,0);
return STATUS_UNSUCCESSFUL;
}
@@ -138,8 +139,11 @@ IRegistryKey_fnNewSubKey(
return STATUS_INSUFFICIENT_RESOURCES;
}
+ if (OuterUnknown)
+ OuterUnknown->lpVtbl->AddRef(OuterUnknown);
+
NewThis->hKey = hKey;
- NewThis->ref = 1;
+ NewThis->ref = 2;
NewThis->lpVtbl = &vt_IRegistryKey;
*RegistrySubKey = (PREGISTRYKEY)&NewThis->lpVtbl;
@@ -222,7 +226,7 @@ static IRegistryKeyVtbl vt_IRegistryKey =
};
/*
- * @unimplemented
+ * @implemented
*/
NTSTATUS NTAPI
PcNewRegistryKey(
@@ -301,9 +305,12 @@ PcNewRegistryKey(
return STATUS_INSUFFICIENT_RESOURCES;
}
+ if (OuterUnknown)
+ OuterUnknown->lpVtbl->AddRef(OuterUnknown);
+
This->hKey = hHandle;
This->lpVtbl = &vt_IRegistryKey;
- This->ref = 1;
+ This->ref = 2;
*OutRegistryKey = (PREGISTRYKEY)&This->lpVtbl;
DPRINT1("PcNewRegistryKey result %p\n", *OutRegistryKey);
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/resource.c b/reactos/drivers/wdm/audio/backpln/portcls/resource.c
index 3f97ddda21d..d4f75af8842 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/resource.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/resource.c
@@ -37,13 +37,27 @@ IResourceList_fnQueryInterface(
IN REFIID refiid,
OUT PVOID* Output)
{
+ WCHAR Buffer[100];
+
IResourceListImpl * This = (IResourceListImpl*)iface;
- if (IsEqualGUIDAligned(refiid, &IID_IResourceList))
+ if (IsEqualGUIDAligned(refiid, &IID_IResourceList) ||
+ IsEqualGUIDAligned(refiid, &IID_IUnknown))
{
*Output = &This->lpVtbl;
InterlockedIncrement(&This->ref);
return STATUS_SUCCESS;
}
+#if 0
+ else if (IsEqualGUIDAligned(refiid, &IID_IDrmPort) ||
+ IsEqualGUIDAligned(refiid, &IID_IDrmPort2))
+ {
+ return NewIDrmPort((PDRMPORT2*)Output);
+ }
+#endif
+ StringFromCLSID(refiid, Buffer);
+ DPRINT1("IResourceList_fnQueryInterface no interface!!! iface %S\n", Buffer);
+ KeBugCheckEx(0, 0, 0, 0, 0);
+
return STATUS_UNSUCCESSFUL;
}
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/undoc.c b/reactos/drivers/wdm/audio/backpln/portcls/undoc.c
index ce65a7206bf..54948526270 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/undoc.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/undoc.c
@@ -79,6 +79,41 @@ PcCaptureFormat(
return STATUS_NOT_IMPLEMENTED;
}
+NTSTATUS
+AddToPropertyTable(
+ IN OUT SUBDEVICE_DESCRIPTOR * Descriptor,
+ IN KSPROPERTY_SET * FilterProperty)
+{
+ if (Descriptor->FilterPropertySet.FreeKsPropertySetOffset >= Descriptor->FilterPropertySet.MaxKsPropertySetCount)
+ {
+ DPRINT1("FIXME\n");
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ RtlMoveMemory(&Descriptor->FilterPropertySet.Properties[Descriptor->FilterPropertySet.FreeKsPropertySetOffset],
+ FilterProperty,
+ sizeof(KSPROPERTY_SET));
+
+ if (FilterProperty->PropertiesCount)
+ {
+ Descriptor->FilterPropertySet.Properties[Descriptor->FilterPropertySet.FreeKsPropertySetOffset].PropertyItem = AllocateItem(NonPagedPool,
+ sizeof(KSPROPERTY_ITEM) * FilterProperty->PropertiesCount,
+ TAG_PORTCLASS);
+
+ if (!Descriptor->FilterPropertySet.Properties[Descriptor->FilterPropertySet.FreeKsPropertySetOffset].PropertyItem)
+ {
+ Descriptor->FilterPropertySet.Properties[Descriptor->FilterPropertySet.FreeKsPropertySetOffset].PropertiesCount = 0;
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ RtlMoveMemory((PVOID)Descriptor->FilterPropertySet.Properties[Descriptor->FilterPropertySet.FreeKsPropertySetOffset].PropertyItem,
+ FilterProperty->PropertyItem,
+ sizeof(KSPROPERTY_ITEM) * FilterProperty->PropertiesCount);
+ }
+
+ Descriptor->FilterPropertySet.FreeKsPropertySetOffset++;
+
+ return STATUS_SUCCESS;
+}
/*
* @unimplemented
@@ -117,13 +152,28 @@ PcCreateSubdeviceDescriptor(
RtlCopyMemory(Descriptor->Interfaces, InterfaceGuids, sizeof(GUID) * InterfaceCount);
Descriptor->InterfaceCount = InterfaceCount;
+ if (FilterPropertiesCount)
+ {
+
+ /// FIXME
+ /// handle driver properties
+ Descriptor->FilterPropertySet.Properties = AllocateItem(NonPagedPool, sizeof(KSPROPERTY_SET) * FilterPropertiesCount, TAG_PORTCLASS);
+ if (! Descriptor->FilterPropertySet.Properties)
+ goto cleanup;
+
+ Descriptor->FilterPropertySet.MaxKsPropertySetCount = FilterPropertiesCount;
+ for(Index = 0; Index < FilterPropertiesCount; Index++)
+ {
+ Status = AddToPropertyTable(Descriptor, &FilterProperties[Index]);
+ if (!NT_SUCCESS(Status))
+ goto cleanup;
+ }
+ }
+
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);
+ Descriptor->Factory.KsPinDescriptor = AllocateItem(NonPagedPool, FilterDescription->PinSize * FilterDescription->PinCount, TAG_PORTCLASS);
if (!Descriptor->Factory.KsPinDescriptor)
goto cleanup;
@@ -132,7 +182,7 @@ PcCreateSubdeviceDescriptor(
/* copy pin factories */
for(Index = 0; Index < FilterDescription->PinCount; Index++)
- RtlMoveMemory(&Descriptor->Factory.KsPinDescriptor[Index], &FilterDescription->Pins[Index].KsPinDescriptor, sizeof(KSPIN_DESCRIPTOR));
+ RtlMoveMemory(&Descriptor->Factory.KsPinDescriptor[Index], &FilterDescription->Pins[Index].KsPinDescriptor, FilterDescription->PinSize);
}
*OutSubdeviceDescriptor = Descriptor;