diff --git a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
index e0b1686dc48..e53a56e5880 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
@@ -168,7 +168,8 @@ PcAddAdapterDevice(
RtlZeroMemory(portcls_ext, sizeof(PCExtension));
portcls_ext->PhysicalDeviceObject = PhysicalDeviceObject;
portcls_ext->StartDevice = StartDevice;
- InitializeListHead(&portcls_ext->SubDeviceList);
+ InitializeListHead(&portcls_ext->SubDeviceList);
+ InitializeListHead(&portcls_ext->PhysicalConnectionList);
status = KsAllocateDeviceHeader(&portcls_ext->KsDeviceHeader, 0, NULL);
if (!NT_SUCCESS(status))
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
new file mode 100644
index 00000000000..fc387b91d9d
--- /dev/null
+++ b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
@@ -0,0 +1,43 @@
+
+
+NTSTATUS
+NewIrpStreamPhysical(
+ OUT IIrpStreamPhysical ** OutIIrpStreamPhysical,
+ IN IUnknown *OuterUnknown)
+{
+ return STATUS_UNSUCCESSFUL;
+}
+
+
+/*
+ * @implemented
+ */
+
+NTSTATUS
+NTAPI
+PcNewIrpStreamPhysical(
+ OUT IIrpStreamPhysical ** OutIrpStreamPhysical,
+ IN IUnknown * OuterUnknown,
+ IN BOOLEAN Wait,
+ IN KSPIN_CONNECT *ConnectDetails,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PDMA_ADAPTER DmaAdapter)
+{
+ NTSTATUS Status;
+ IIrpStreamPhysical * Irp;
+
+ Status = NewIrpStreamPhysical(&Irp, OuterUnknown);
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+
+ Status = Irp->lpVtbl->Init(Irp, Wait, ConnectDetails, DeviceObject, DmaAdapter);
+ if (!NT_SUCCESS(Status))
+ {
+ Irp->lpVtbl->Release(Irp);
+ return Status;
+ }
+
+ *OutIrpStreamPhysical = Irp;
+ return Status;
+}
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
index 49ca49d28ea..45edf1cd660 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
@@ -187,7 +187,15 @@ IPortTopology_fnNewRegistryKey(
DPRINT("IPortWaveCyclic_fnNewRegistryKey called w/o initialized\n");
return STATUS_UNSUCCESSFUL;
}
- return STATUS_UNSUCCESSFUL;
+ return PcNewRegistryKey(OutRegistryKey,
+ OuterUnknown,
+ RegistryKeyType,
+ DesiredAccess,
+ This->pDeviceObject,
+ NULL,//FIXME
+ ObjectAttributes,
+ CreateOptions,
+ Disposition);
}
static IPortTopologyVtbl vt_IPortTopology =
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
index 5ad694afa0a..1ad3a4e5b76 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
@@ -247,7 +247,23 @@ IPortWavePci_fnNewRegistryKey(
IN ULONG CreateOptions OPTIONAL,
OUT PULONG Disposition OPTIONAL)
{
- return STATUS_UNSUCCESSFUL;
+ IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+
+ if (!This->bInitialized)
+ {
+ DPRINT("IPortWaveCyclic_fnNewRegistryKey called w/o initiazed\n");
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ return PcNewRegistryKey(OutRegistryKey,
+ OuterUnknown,
+ RegistryKeyType,
+ DesiredAccess,
+ This->pDeviceObject,
+ NULL,//FIXME
+ ObjectAttributes,
+ CreateOptions,
+ Disposition);
}
NTSTATUS
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
index c5ffa080f8c..184a0c574b7 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
+++ b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
@@ -11,6 +11,7 @@
rtl
hal
api.c
+ connection.c
dll.c
dma_slave.c
drm_port.c
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/power.c b/reactos/drivers/wdm/audio/backpln/portcls/power.c
index 3f0a4060c2c..9c1338963a3 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/power.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/power.c
@@ -36,3 +36,50 @@ PcRegisterAdapterPowerManagement(
DeviceExt->AdapterPowerManagement = pPower;
return STATUS_SUCCESS;
}
+
+
+static
+VOID
+NTAPI
+PwrCompletionCallback(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PVOID Context,
+ IN PIO_STATUS_BLOCK IoStatus)
+{
+ KeSetEvent((PRKEVENT)Context, IO_NO_INCREMENT, FALSE);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS NTAPI
+PcRequestNewPowerState(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN DEVICE_POWER_STATE RequestedNewState)
+{
+ KEVENT Event;
+ NTSTATUS Status;
+ POWER_STATE PowerState;
+ PCExtension* DeviceExt;
+
+ if (!DeviceObject || !RequestedNewState)
+ return STATUS_INVALID_PARAMETER;
+
+ DeviceExt = (PCExtension*)DeviceObject->DeviceExtension;
+ KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
+
+ PowerState.DeviceState = RequestedNewState;
+ PowerState.SystemState = PowerSystemUnspecified;
+
+ Status = PoRequestPowerIrp(DeviceExt->PhysicalDeviceObject, IRP_MN_SET_POWER, PowerState, PwrCompletionCallback, (PVOID)&Event, NULL);
+ if (NT_SUCCESS(Status))
+ {
+ KeWaitForSingleObject((PVOID)&Event, Executive, KernelMode, FALSE, NULL);
+ }
+
+
+ return Status;
+}
+
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h
index 07874386224..17afe309b97 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/private.h
+++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h
@@ -15,6 +15,7 @@
#include
#include "interfaces.h"
+#include
#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
#define TAG_PORTCLASS TAG('P', 'C', 'L', 'S')
@@ -86,6 +87,17 @@ typedef struct
KSOBJECT_HEADER ObjectHeader;
}SUBDEVICE_ENTRY;
+typedef struct
+{
+ LIST_ENTRY Entry;
+ ISubdevice * FromSubDevice;
+ LPWSTR FromUnicodeString;
+ ULONG FromPin;
+ ISubdevice * ToSubDevice;
+ LPWSTR ToUnicodeString;
+ ULONG ToPin;
+}PHYSICAL_CONNECTION;
+
typedef struct
{
@@ -96,6 +108,7 @@ typedef struct
IResourceList* resources;
LIST_ENTRY SubDeviceList;
+ LIST_ENTRY PhysicalConnectionList;
} PCExtension;
diff --git a/reactos/drivers/wdm/audio/backpln/portcls/stubs.c b/reactos/drivers/wdm/audio/backpln/portcls/stubs.c
index 480a9d6010a..63e0a2ebab3 100644
--- a/reactos/drivers/wdm/audio/backpln/portcls/stubs.c
+++ b/reactos/drivers/wdm/audio/backpln/portcls/stubs.c
@@ -12,29 +12,6 @@
#include "private.h"
#include
-/*
- Factory Stubs
-*/
-
-
-
-/* ===============================================================
- Power Management
-*/
-
-/*
- * @unimplemented
- */
-NTSTATUS NTAPI
-PcRequestNewPowerState(
- IN PDEVICE_OBJECT pDeviceObject,
- IN DEVICE_POWER_STATE RequestedNewState)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-
/* ===============================================================
Properties
*/
@@ -51,60 +28,3 @@ PcCompletePendingPropertyRequest(
return STATUS_UNSUCCESSFUL;
}
-/* ===============================================================
- Physical Connections
-*/
-
-/*
- * @unimplemented
- */
-NTSTATUS NTAPI
-PcRegisterPhysicalConnection(
- IN PDEVICE_OBJECT DeviceObject,
- IN PUNKNOWN FromUnknown,
- IN ULONG FromPin,
- IN PUNKNOWN ToUnknown,
- IN ULONG ToPin)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS NTAPI
-PcRegisterPhysicalConnectionFromExternal(
- IN PDEVICE_OBJECT DeviceObject,
- IN PUNICODE_STRING FromString,
- IN ULONG FromPin,
- IN PUNKNOWN ToUnknown,
- IN ULONG ToPin)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS NTAPI
-PcRegisterPhysicalConnectionToExternal(
- IN PDEVICE_OBJECT DeviceObject,
- IN PUNKNOWN FromUnknown,
- IN ULONG FromPin,
- IN PUNICODE_STRING ToString,
- IN ULONG ToPin)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
-
-
-/* ===============================================================
- Misc
-*/
-
-/*
- * @unimplemented
- */