Standardize comment headers. Patch by Trevor McCort
[reactos.git] / reactos / ntoskrnl / po / power.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/po/power.c
6 * PURPOSE: Power Manager
7 *
8 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
9 */
10
11 #include <ntoskrnl.h>
12 #define NDEBUG
13 #include <internal/debug.h>
14
15
16 PDEVICE_NODE PopSystemPowerDeviceNode = NULL;
17
18 /*
19 * @implemented
20 */
21 NTSTATUS
22 STDCALL
23 PoCallDriver(
24 IN PDEVICE_OBJECT DeviceObject,
25 IN OUT PIRP Irp)
26 {
27 NTSTATUS Status;
28
29 Status = IoCallDriver(DeviceObject, Irp);
30
31 return Status;
32 }
33
34 /*
35 * @unimplemented
36 */
37 PULONG
38 STDCALL
39 PoRegisterDeviceForIdleDetection(
40 IN PDEVICE_OBJECT DeviceObject,
41 IN ULONG ConservationIdleTime,
42 IN ULONG PerformanceIdleTime,
43 IN DEVICE_POWER_STATE State)
44 {
45 return NULL;
46 }
47
48 /*
49 * @unimplemented
50 */
51 PVOID
52 STDCALL
53 PoRegisterSystemState(
54 IN PVOID StateHandle,
55 IN EXECUTION_STATE Flags)
56 {
57 return NULL;
58 }
59
60 /*
61 * @unimplemented
62 */
63 NTSTATUS
64 STDCALL
65 PoRequestPowerIrp(
66 IN PDEVICE_OBJECT DeviceObject,
67 IN UCHAR MinorFunction,
68 IN POWER_STATE PowerState,
69 IN PREQUEST_POWER_COMPLETE CompletionFunction,
70 IN PVOID Context,
71 OUT PIRP *Irp OPTIONAL)
72 {
73 return STATUS_NOT_IMPLEMENTED;
74 }
75
76 VOID
77 STDCALL
78 PoSetDeviceBusy(
79 PULONG IdlePointer)
80 {
81 }
82
83 /*
84 * @unimplemented
85 */
86 POWER_STATE
87 STDCALL
88 PoSetPowerState(
89 IN PDEVICE_OBJECT DeviceObject,
90 IN POWER_STATE_TYPE Type,
91 IN POWER_STATE State)
92 {
93 POWER_STATE ps;
94
95 ps.SystemState = PowerSystemWorking; // Fully on
96 ps.DeviceState = PowerDeviceD0; // Fully on
97
98 return ps;
99 }
100
101 /*
102 * @unimplemented
103 */
104 VOID
105 STDCALL
106 PoSetSystemState(
107 IN EXECUTION_STATE Flags)
108 {
109 }
110
111 /*
112 * @unimplemented
113 */
114 VOID
115 STDCALL
116 PoStartNextPowerIrp(
117 IN PIRP Irp)
118 {
119 }
120
121 /*
122 * @unimplemented
123 */
124 VOID
125 STDCALL
126 PoUnregisterSystemState(
127 IN PVOID StateHandle)
128 {
129 }
130
131 NTSTATUS
132 PopSetSystemPowerState(
133 SYSTEM_POWER_STATE PowerState)
134 {
135
136 #ifdef ACPI
137
138 IO_STATUS_BLOCK IoStatusBlock;
139 PDEVICE_OBJECT DeviceObject;
140 PIO_STACK_LOCATION IrpSp;
141 PDEVICE_OBJECT Fdo;
142 NTSTATUS Status;
143 KEVENT Event;
144 PIRP Irp;
145
146 Status = IopGetSystemPowerDeviceObject(&DeviceObject);
147 if (!NT_SUCCESS(Status)) {
148 CPRINT("No system power driver available\n");
149 return STATUS_UNSUCCESSFUL;
150 }
151
152 Fdo = IoGetAttachedDeviceReference(DeviceObject);
153
154 if (Fdo == DeviceObject)
155 {
156 DPRINT("An FDO was not attached\n");
157 return STATUS_UNSUCCESSFUL;
158 }
159
160 KeInitializeEvent(&Event,
161 NotificationEvent,
162 FALSE);
163
164 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_POWER,
165 Fdo,
166 NULL,
167 0,
168 NULL,
169 &Event,
170 &IoStatusBlock);
171
172 IrpSp = IoGetNextIrpStackLocation(Irp);
173 IrpSp->MinorFunction = IRP_MN_SET_POWER;
174 IrpSp->Parameters.Power.Type = SystemPowerState;
175 IrpSp->Parameters.Power.State.SystemState = PowerState;
176
177 Status = PoCallDriver(Fdo, Irp);
178 if (Status == STATUS_PENDING)
179 {
180 KeWaitForSingleObject(&Event,
181 Executive,
182 KernelMode,
183 FALSE,
184 NULL);
185 Status = IoStatusBlock.Status;
186 }
187
188 ObDereferenceObject(Fdo);
189
190 return Status;
191
192 #endif /* ACPI */
193
194 return STATUS_NOT_IMPLEMENTED;
195 }
196
197 VOID INIT_FUNCTION
198 PoInit(VOID)
199 {
200 }
201
202 /*
203 * @unimplemented
204 */
205 NTSTATUS
206 STDCALL
207 NtInitiatePowerAction (
208 IN POWER_ACTION SystemAction,
209 IN SYSTEM_POWER_STATE MinSystemState,
210 IN ULONG Flags,
211 IN BOOLEAN Asynchronous)
212 {
213 UNIMPLEMENTED;
214 return STATUS_NOT_IMPLEMENTED;
215 }
216
217 /*
218 * @unimplemented
219 */
220 NTSTATUS
221 STDCALL
222 NtPowerInformation(
223 IN POWER_INFORMATION_LEVEL PowerInformationLevel,
224 IN PVOID InputBuffer OPTIONAL,
225 IN ULONG InputBufferLength,
226 OUT PVOID OutputBuffer OPTIONAL,
227 IN ULONG OutputBufferLength
228 )
229 {
230 NTSTATUS Status;
231
232 DPRINT("NtPowerInformation(PowerInformationLevel 0x%x, InputBuffer 0x%x, "
233 "InputBufferLength 0x%x, OutputBuffer 0x%x, OutputBufferLength 0x%x)\n",
234 PowerInformationLevel,
235 InputBuffer, InputBufferLength,
236 OutputBuffer, OutputBufferLength);
237 switch (PowerInformationLevel)
238 {
239 case SystemBatteryState:
240 {
241 PSYSTEM_BATTERY_STATE BatteryState = (PSYSTEM_BATTERY_STATE)OutputBuffer;
242
243 if (InputBuffer != NULL)
244 return STATUS_INVALID_PARAMETER;
245 if (OutputBufferLength < sizeof(SYSTEM_BATTERY_STATE))
246 return STATUS_BUFFER_TOO_SMALL;
247
248 /* Just zero the struct (and thus set BatteryState->BatteryPresent = FALSE) */
249 RtlZeroMemory(BatteryState, sizeof(SYSTEM_BATTERY_STATE));
250 BatteryState->EstimatedTime = (ULONG)-1;
251
252 Status = STATUS_SUCCESS;
253 break;
254 }
255
256 default:
257 Status = STATUS_NOT_IMPLEMENTED;
258 DPRINT1("PowerInformationLevel 0x%x is UNIMPLEMENTED! Have a nice day.\n",
259 PowerInformationLevel);
260 for (;;);
261 break;
262 }
263
264 return Status;
265 }
266
267 /* EOF */