winsta: fix spec file
[reactos.git] / reactos / drivers / wdm / audio / backpln / portcls / power.cpp
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/power.cpp
5 * PURPOSE: Power support functions
6 * PROGRAMMER: Johannes Anderwald
7 */
8
9 #include "private.hpp"
10
11 NTSTATUS
12 NTAPI
13 PcRegisterAdapterPowerManagement(
14 IN PUNKNOWN pUnknown,
15 IN PVOID pvContext)
16 {
17 NTSTATUS Status;
18 PDEVICE_OBJECT pDeviceObject;
19 PPCLASS_DEVICE_EXTENSION DeviceExt;
20 IAdapterPowerManagement * pPower;
21
22 DPRINT("PcRegisterAdapterPowerManagement pUnknown %p pvContext %p\n", pUnknown, pvContext);
23 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
24
25 if (!pUnknown || !pvContext)
26 return STATUS_INVALID_PARAMETER;
27
28
29 pDeviceObject = (PDEVICE_OBJECT)pvContext;
30 DeviceExt = (PPCLASS_DEVICE_EXTENSION)pDeviceObject->DeviceExtension;
31
32 Status = pUnknown->QueryInterface(IID_IAdapterPowerManagement, (PVOID*)&pPower);
33 if (!NT_SUCCESS(Status))
34 {
35 DPRINT1("PcRegisterAdapterPowerManagement no IAdapterPowerManagement interface %x\n", Status);
36 DeviceExt->AdapterPowerManagement = NULL;
37 return STATUS_SUCCESS;
38 }
39
40 DeviceExt->AdapterPowerManagement = pPower;
41 DPRINT("PcRegisterAdapterPowerManagement success %x\n", Status);
42 return STATUS_SUCCESS;
43 }
44
45
46 static
47 VOID
48 NTAPI
49 PwrCompletionCallback(
50 IN PDEVICE_OBJECT DeviceObject,
51 IN UCHAR MinorFunction,
52 IN POWER_STATE PowerState,
53 IN PVOID Context,
54 IN PIO_STATUS_BLOCK IoStatus)
55 {
56 KeSetEvent((PRKEVENT)Context, IO_NO_INCREMENT, FALSE);
57 }
58
59 NTSTATUS
60 NTAPI
61 PcRequestNewPowerState(
62 IN PDEVICE_OBJECT DeviceObject,
63 IN DEVICE_POWER_STATE RequestedNewState)
64 {
65 KEVENT Event;
66 NTSTATUS Status;
67 POWER_STATE PowerState;
68 PPCLASS_DEVICE_EXTENSION DeviceExt;
69
70 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
71
72 if (!DeviceObject || !RequestedNewState)
73 return STATUS_INVALID_PARAMETER;
74
75 DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
76 KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
77
78 PowerState.DeviceState = RequestedNewState;
79 PowerState.SystemState = PowerSystemUnspecified;
80
81 Status = PoRequestPowerIrp(DeviceExt->PhysicalDeviceObject, IRP_MN_SET_POWER, PowerState, PwrCompletionCallback, (PVOID)&Event, NULL);
82 if (NT_SUCCESS(Status))
83 {
84 KeWaitForSingleObject((PVOID)&Event, Executive, KernelMode, FALSE, NULL);
85 }
86
87
88 return Status;
89 }
90