Merge from amd64 branch:
[reactos.git] / reactos / ntoskrnl / include / internal / po.h
1 /*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/include/po.h
5 * PURPOSE: Internal header for the Power Manager
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9 #include <poclass.h>
10
11 //
12 // Define this if you want debugging support
13 //
14 #define _PO_DEBUG_ 0x00
15
16 //
17 // These define the Debug Masks Supported
18 //
19 #define PO_STATE_DEBUG 0x01
20
21 //
22 // Debug/Tracing support
23 //
24 #if _PO_DEBUG_
25 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
26 #define POTRACE DbgPrintEx
27 #else
28 #define POTRACE(x, ...) \
29 if (x & PopTraceLevel) DbgPrint(__VA_ARGS__)
30 #endif
31 #else
32 #define POTRACE(x, ...) DPRINT(__VA_ARGS__)
33 #endif
34
35 typedef struct _PO_HIBER_PERF
36 {
37 ULONGLONG IoTicks;
38 ULONGLONG InitTicks;
39 ULONGLONG CopyTicks;
40 ULONGLONG StartCount;
41 ULONG ElapsedTime;
42 ULONG IoTime;
43 ULONG CopyTime;
44 ULONG InitTime;
45 ULONG PagesWritten;
46 ULONG PagesProcessed;
47 ULONG BytesCopied;
48 ULONG DumpCount;
49 ULONG FileRuns;
50 } PO_HIBER_PERF, *PPO_HIBER_PERF;
51
52 typedef struct _PO_MEMORY_IMAGE
53 {
54 ULONG Signature;
55 ULONG Version;
56 ULONG CheckSum;
57 ULONG LengthSelf;
58 PFN_NUMBER PageSelf;
59 ULONG PageSize;
60 ULONG ImageType;
61 LARGE_INTEGER SystemTime;
62 ULONGLONG InterruptTime;
63 ULONG FeatureFlags;
64 UCHAR HiberFlags;
65 UCHAR spare[3];
66 ULONG NoHiberPtes;
67 ULONG_PTR HiberVa;
68 PHYSICAL_ADDRESS HiberPte;
69 ULONG NoFreePages;
70 ULONG FreeMapCheck;
71 ULONG WakeCheck;
72 PFN_NUMBER TotalPages;
73 PFN_NUMBER FirstTablePage;
74 PFN_NUMBER LastFilePage;
75 PO_HIBER_PERF PerfInfo;
76 } PO_MEMORY_IMAGE, *PPO_MEMORY_IMAGE;
77
78 typedef struct _PO_MEMORY_RANGE_ARRAY_RANGE
79 {
80 PFN_NUMBER PageNo;
81 PFN_NUMBER StartPage;
82 PFN_NUMBER EndPage;
83 ULONG CheckSum;
84 } PO_MEMORY_RANGE_ARRAY_RANGE;
85
86 typedef struct _PO_MEMORY_RANGE_ARRAY_LINK
87 {
88 struct _PO_MEMORY_RANGE_ARRAY *Next;
89 PFN_NUMBER NextTable;
90 ULONG CheckSum;
91 ULONG EntryCount;
92 } PO_MEMORY_RANGE_ARRAY_LINK;
93
94 typedef struct _PO_MEMORY_RANGE_ARRAY
95 {
96 union
97 {
98 PO_MEMORY_RANGE_ARRAY_RANGE Range;
99 PO_MEMORY_RANGE_ARRAY_LINK Link;
100 };
101 } PO_MEMORY_RANGE_ARRAY, *PPO_MEMORY_RANGE_ARRAY;
102
103 typedef struct _POP_HIBER_CONTEXT
104 {
105 BOOLEAN WriteToFile;
106 BOOLEAN ReserveLoaderMemory;
107 BOOLEAN ReserveFreeMemory;
108 BOOLEAN VerifyOnWake;
109 BOOLEAN Reset;
110 UCHAR HiberFlags;
111 BOOLEAN LinkFile;
112 HANDLE LinkFileHandle;
113 PKSPIN_LOCK Lock;
114 BOOLEAN MapFrozen;
115 RTL_BITMAP MemoryMap;
116 LIST_ENTRY ClonedRanges;
117 ULONG ClonedRangeCount;
118 PLIST_ENTRY NextCloneRange;
119 PFN_NUMBER NextPreserve;
120 PMDL LoaderMdl;
121 PMDL Clones;
122 PUCHAR NextClone;
123 ULONG NoClones;
124 PMDL Spares;
125 ULONGLONG PagesOut;
126 PVOID IoPage;
127 PVOID CurrentMcb;
128 PVOID DumpStack;
129 PKPROCESSOR_STATE WakeState;
130 ULONG NoRanges;
131 ULONG_PTR HiberVa;
132 PHYSICAL_ADDRESS HiberPte;
133 NTSTATUS Status;
134 PPO_MEMORY_IMAGE MemoryImage;
135 PPO_MEMORY_RANGE_ARRAY TableHead;
136 PVOID CompressionWorkspace;
137 PUCHAR CompressedWriteBuffer;
138 PULONG PerformanceStats;
139 PVOID CompressionBlock;
140 PVOID DmaIO;
141 PVOID TemporaryHeap;
142 PO_HIBER_PERF PerfInfo;
143 } POP_HIBER_CONTEXT, *PPOP_HIBER_CONTEXT;
144
145 typedef struct _PO_NOTIFY_ORDER_LEVEL
146 {
147 KEVENT LevelReady;
148 ULONG DeviceCount;
149 ULONG ActiveCount;
150 LIST_ENTRY WaitSleep;
151 LIST_ENTRY ReadySleep;
152 LIST_ENTRY Pending;
153 LIST_ENTRY Complete;
154 LIST_ENTRY ReadyS0;
155 LIST_ENTRY WaitS0;
156 } PO_NOTIFY_ORDER_LEVEL, *PPO_NOTIFY_ORDER_LEVEL;
157
158 typedef struct _POP_SHUTDOWN_BUG_CHECK
159 {
160 HANDLE ThreadHandle;
161 HANDLE ThreadId;
162 HANDLE ProcessId;
163 ULONG Code;
164 ULONG_PTR Parameter1;
165 ULONG_PTR Parameter2;
166 ULONG_PTR Parameter3;
167 ULONG_PTR Parameter4;
168 } POP_SHUTDOWN_BUG_CHECK, *PPOP_SHUTDOWN_BUG_CHECK;
169
170 typedef struct _POP_DEVICE_POWER_IRP
171 {
172 SINGLE_LIST_ENTRY Free;
173 PIRP Irp;
174 PPO_DEVICE_NOTIFY Notify;
175 LIST_ENTRY Pending;
176 LIST_ENTRY Complete;
177 LIST_ENTRY Abort;
178 LIST_ENTRY Failed;
179 } POP_DEVICE_POWER_IRP, *PPOP_DEVICE_POWER_IRP;
180
181 typedef struct _PO_DEVICE_NOTIFY_ORDER
182 {
183 ULONG DevNodeSequence;
184 PDEVICE_OBJECT *WarmEjectPdoPointer;
185 PO_NOTIFY_ORDER_LEVEL OrderLevel[8];
186 } PO_DEVICE_NOTIFY_ORDER, *PPO_DEVICE_NOTIFY_ORDER;
187
188 typedef struct _POP_DEVICE_SYS_STATE
189 {
190 UCHAR IrpMinor;
191 SYSTEM_POWER_STATE SystemState;
192 PKEVENT Event;
193 KSPIN_LOCK SpinLock;
194 PKTHREAD Thread;
195 BOOLEAN GetNewDeviceList;
196 PO_DEVICE_NOTIFY_ORDER Order;
197 NTSTATUS Status;
198 PDEVICE_OBJECT FailedDevice;
199 BOOLEAN Waking;
200 BOOLEAN Cancelled;
201 BOOLEAN IgnoreErrors;
202 BOOLEAN IgnoreNotImplemented;
203 BOOLEAN _WaitAny;
204 BOOLEAN _WaitAll;
205 LIST_ENTRY PresentIrpQueue;
206 POP_DEVICE_POWER_IRP Head;
207 POP_DEVICE_POWER_IRP PowerIrpState[20];
208 } POP_DEVICE_SYS_STATE, *PPOP_DEVICE_SYS_STATE;
209
210 typedef struct _POP_POWER_ACTION
211 {
212 UCHAR Updates;
213 UCHAR State;
214 BOOLEAN Shutdown;
215 POWER_ACTION Action;
216 SYSTEM_POWER_STATE LightestState;
217 ULONG Flags;
218 NTSTATUS Status;
219 UCHAR IrpMinor;
220 SYSTEM_POWER_STATE SystemState;
221 SYSTEM_POWER_STATE NextSystemState;
222 PPOP_SHUTDOWN_BUG_CHECK ShutdownBugCode;
223 PPOP_DEVICE_SYS_STATE DevState;
224 PPOP_HIBER_CONTEXT HiberContext;
225 ULONGLONG WakeTime;
226 ULONGLONG SleepTime;
227 } POP_POWER_ACTION, *PPOP_POWER_ACTION;
228
229 typedef enum _POP_DEVICE_IDLE_TYPE
230 {
231 DeviceIdleNormal,
232 DeviceIdleDisk,
233 } POP_DEVICE_IDLE_TYPE, *PPOP_DEVICE_IDLE_TYPE;
234
235 typedef struct _POWER_CHANNEL_SUMMARY
236 {
237 ULONG Signature;
238 ULONG TotalCount;
239 ULONG D0Count;
240 LIST_ENTRY NotifyList;
241 } POWER_CHANNEL_SUMMARY, *PPOWER_CHANNEL_SUMMARY;
242
243 typedef struct _DEVICE_OBJECT_POWER_EXTENSION
244 {
245 ULONG IdleCount;
246 ULONG ConservationIdleTime;
247 ULONG PerformanceIdleTime;
248 PDEVICE_OBJECT DeviceObject;
249 LIST_ENTRY IdleList;
250 DEVICE_POWER_STATE State;
251 LIST_ENTRY NotifySourceList;
252 LIST_ENTRY NotifyTargetList;
253 POWER_CHANNEL_SUMMARY PowerChannelSummary;
254 LIST_ENTRY Volume;
255 } DEVICE_OBJECT_POWER_EXTENSION, *PDEVICE_OBJECT_POWER_EXTENSION;
256
257 //
258 // Initialization routines
259 //
260 BOOLEAN
261 NTAPI
262 PoInitSystem(
263 IN ULONG BootPhase
264 );
265
266 VOID
267 NTAPI
268 PoInitializePrcb(
269 IN PKPRCB Prcb
270 );
271
272 //
273 // I/O Routines
274 //
275 VOID
276 NTAPI
277 PoInitializeDeviceObject(
278 IN OUT PDEVOBJ_EXTENSION DeviceObjectExtension
279 );
280
281 VOID
282 NTAPI
283 PoVolumeDevice(
284 IN PDEVICE_OBJECT DeviceObject
285 );
286
287 //
288 // Power State routines
289 //
290 NTSTATUS
291 NTAPI
292 PopSetSystemPowerState(
293 SYSTEM_POWER_STATE PowerState
294 );
295
296 VOID
297 NTAPI
298 PopCleanupPowerState(
299 IN PPOWER_STATE PowerState
300 );
301
302 NTSTATUS
303 NTAPI
304 PopAddRemoveSysCapsCallback(
305 IN PVOID NotificationStructure,
306 IN PVOID Context
307 );
308
309 //
310 // Notifications
311 //
312 VOID
313 NTAPI
314 PoNotifySystemTimeSet(
315 VOID
316 );
317
318 //
319 // Shutdown routines
320 //
321 VOID
322 NTAPI
323 PopReadShutdownPolicy(
324 VOID
325 );
326
327 VOID
328 NTAPI
329 PopGracefulShutdown(
330 IN PVOID Context
331 );
332
333 VOID
334 NTAPI
335 PopFlushVolumes(
336 IN BOOLEAN ShuttingDown
337 );
338
339 //
340 // Global data inside the Power Manager
341 //
342 extern PDEVICE_NODE PopSystemPowerDeviceNode;
343 extern KGUARDED_MUTEX PopVolumeLock;
344 extern LIST_ENTRY PopVolumeDevices;
345 extern KSPIN_LOCK PopDopeGlobalLock;
346 extern POP_POWER_ACTION PopAction;
347