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 - */