- Implement IPortTopology::NewRegistryKey, IPortWavePci::NewRegistryKey
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Mon, 12 Jan 2009 18:37:02 +0000 (18:37 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Mon, 12 Jan 2009 18:37:02 +0000 (18:37 +0000)
- Implement PcRegisterPhysicalConnection, PcRegisterPhysicalConnectionFromExternal, PcRegisterPhysicalConnectionToExternal- Implement PcRequestNewPowerState

svn path=/trunk/; revision=38731

reactos/drivers/wdm/audio/backpln/portcls/adapter.c
reactos/drivers/wdm/audio/backpln/portcls/irpstream.c [new file with mode: 0644]
reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
reactos/drivers/wdm/audio/backpln/portcls/power.c
reactos/drivers/wdm/audio/backpln/portcls/private.h
reactos/drivers/wdm/audio/backpln/portcls/stubs.c

index e0b1686..e53a56e 100644 (file)
@@ -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 (file)
index 0000000..fc387b9
--- /dev/null
@@ -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;
+}
index 49ca49d..45edf1c 100644 (file)
@@ -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 =
index 5ad694a..1ad3a4e 100644 (file)
@@ -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
index c5ffa08..184a0c5 100644 (file)
@@ -11,6 +11,7 @@
        <library>rtl</library>
        <library>hal</library>
        <file>api.c</file>
+       <file>connection.c</file>
        <file>dll.c</file>
        <file>dma_slave.c</file>
        <file>drm_port.c</file>
index 3f0a406..9c13389 100644 (file)
@@ -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;
+}
+
index 0787438..17afe30 100644 (file)
@@ -15,6 +15,7 @@
 #include <dmusicks.h>
 
 #include "interfaces.h"
+#include <ks.h>
 
 #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;
 
index 480a9d6..63e0a2e 100644 (file)
 #include "private.h"
 #include <portcls.h>
 
-/*
-    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
- */