[NTOSKRNL]
[reactos.git] / reactos / ntoskrnl / include / internal / po.h
index 19387eb..ef4ee1a 100644 (file)
-/* $Id$
- *
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS kernel
- * FILE:            include/internal/po.h
- * PURPOSE:         Internal power manager declarations
- * PROGRAMMER:      Casper S. Hornstrup (chorns@users.sourceforge.net)
- * UPDATE HISTORY:
- *                  01/05/2001  Created
- */
-
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_PO_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_PO_H
-
-#include <ddk/ntddk.h>
-#include <internal/io.h>
+/*
+* PROJECT:         ReactOS Kernel
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            ntoskrnl/include/po.h
+* PURPOSE:         Internal header for the Power Manager
+* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+*/
 
-extern PDEVICE_NODE PopSystemPowerDeviceNode;
+#include "initguid.h"
+#include <poclass.h>
+
+//
+// Define this if you want debugging support
+//
+#define _PO_DEBUG_                                      0x00
+
+//
+// These define the Debug Masks Supported
+//
+#define PO_STATE_DEBUG                                  0x01
+
+//
+// Debug/Tracing support
+//
+#if _PO_DEBUG_
+#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
+#define POTRACE DbgPrintEx
+#else
+#define POTRACE(x, ...)                                 \
+    if (x & PopTraceLevel) DbgPrint(__VA_ARGS__)
+#endif
+#else
+#define POTRACE(x, ...) DPRINT(__VA_ARGS__)
+#endif
+
+typedef struct _PO_HIBER_PERF
+{
+    ULONGLONG IoTicks;
+    ULONGLONG InitTicks;
+    ULONGLONG CopyTicks;
+    ULONGLONG StartCount;
+    ULONG ElapsedTime;
+    ULONG IoTime;
+    ULONG CopyTime;
+    ULONG InitTime;
+    ULONG PagesWritten;
+    ULONG PagesProcessed;
+    ULONG BytesCopied;
+    ULONG DumpCount;
+    ULONG FileRuns;
+} PO_HIBER_PERF, *PPO_HIBER_PERF;
+
+typedef struct _PO_MEMORY_IMAGE
+{
+    ULONG Signature;
+    ULONG Version;
+    ULONG CheckSum;
+    ULONG LengthSelf;
+    PFN_NUMBER PageSelf;
+    ULONG PageSize;
+    ULONG ImageType;
+    LARGE_INTEGER SystemTime;
+    ULONGLONG InterruptTime;
+    ULONG FeatureFlags;
+    UCHAR HiberFlags;
+    UCHAR spare[3];
+    ULONG NoHiberPtes;
+    ULONG_PTR HiberVa;
+    PHYSICAL_ADDRESS HiberPte;
+    ULONG NoFreePages;
+    ULONG FreeMapCheck;
+    ULONG WakeCheck;
+    PFN_NUMBER TotalPages;
+    PFN_NUMBER FirstTablePage;
+    PFN_NUMBER LastFilePage;
+    PO_HIBER_PERF PerfInfo;
+} PO_MEMORY_IMAGE, *PPO_MEMORY_IMAGE;
+
+typedef struct _PO_MEMORY_RANGE_ARRAY_RANGE
+{
+    PFN_NUMBER PageNo;
+    PFN_NUMBER StartPage;
+    PFN_NUMBER EndPage;
+    ULONG CheckSum;
+} PO_MEMORY_RANGE_ARRAY_RANGE;
+
+typedef struct _PO_MEMORY_RANGE_ARRAY_LINK
+{
+    struct _PO_MEMORY_RANGE_ARRAY *Next;
+    PFN_NUMBER NextTable;
+    ULONG CheckSum;
+    ULONG EntryCount;
+} PO_MEMORY_RANGE_ARRAY_LINK;
+
+typedef struct _PO_MEMORY_RANGE_ARRAY
+{
+    union
+    {
+        PO_MEMORY_RANGE_ARRAY_RANGE Range;
+        PO_MEMORY_RANGE_ARRAY_LINK Link;
+    };
+} PO_MEMORY_RANGE_ARRAY, *PPO_MEMORY_RANGE_ARRAY;
+
+typedef struct _POP_HIBER_CONTEXT
+{
+    BOOLEAN WriteToFile;
+    BOOLEAN ReserveLoaderMemory;
+    BOOLEAN ReserveFreeMemory;
+    BOOLEAN VerifyOnWake;
+    BOOLEAN Reset;
+    UCHAR HiberFlags;
+    BOOLEAN LinkFile;
+    HANDLE LinkFileHandle;
+    PKSPIN_LOCK Lock;
+    BOOLEAN MapFrozen;
+    RTL_BITMAP MemoryMap;
+    LIST_ENTRY ClonedRanges;
+    ULONG ClonedRangeCount;
+    PLIST_ENTRY NextCloneRange;
+    PFN_NUMBER NextPreserve;
+    PMDL LoaderMdl;
+    PMDL Clones;
+    PUCHAR NextClone;
+    ULONG NoClones;
+    PMDL Spares;
+    ULONGLONG PagesOut;
+    PVOID IoPage;
+    PVOID CurrentMcb;
+    PVOID DumpStack;
+    PKPROCESSOR_STATE WakeState;
+    ULONG NoRanges;
+    ULONG_PTR HiberVa;
+    PHYSICAL_ADDRESS HiberPte;
+    NTSTATUS Status;
+    PPO_MEMORY_IMAGE MemoryImage;
+    PPO_MEMORY_RANGE_ARRAY TableHead;
+    PVOID CompressionWorkspace;
+    PUCHAR CompressedWriteBuffer;
+    PULONG PerformanceStats;
+    PVOID CompressionBlock;
+    PVOID DmaIO;
+    PVOID TemporaryHeap;
+    PO_HIBER_PERF PerfInfo;
+} POP_HIBER_CONTEXT, *PPOP_HIBER_CONTEXT;
+
+typedef struct _PO_NOTIFY_ORDER_LEVEL
+{
+    KEVENT LevelReady;
+    ULONG DeviceCount;
+    ULONG ActiveCount;
+    LIST_ENTRY WaitSleep;
+    LIST_ENTRY ReadySleep;
+    LIST_ENTRY Pending;
+    LIST_ENTRY Complete;
+    LIST_ENTRY ReadyS0;
+    LIST_ENTRY WaitS0;
+} PO_NOTIFY_ORDER_LEVEL, *PPO_NOTIFY_ORDER_LEVEL;
+
+typedef struct _POP_SHUTDOWN_BUG_CHECK
+{
+    HANDLE ThreadHandle;
+    HANDLE ThreadId;
+    HANDLE ProcessId;
+    ULONG Code;
+    ULONG_PTR Parameter1;
+    ULONG_PTR Parameter2;
+    ULONG_PTR Parameter3;
+    ULONG_PTR Parameter4;
+} POP_SHUTDOWN_BUG_CHECK, *PPOP_SHUTDOWN_BUG_CHECK;
+
+typedef struct _POP_DEVICE_POWER_IRP
+{
+    SINGLE_LIST_ENTRY Free;
+    PIRP Irp;
+    PPO_DEVICE_NOTIFY Notify;
+    LIST_ENTRY Pending;
+    LIST_ENTRY Complete;
+    LIST_ENTRY Abort;
+    LIST_ENTRY Failed;
+} POP_DEVICE_POWER_IRP, *PPOP_DEVICE_POWER_IRP;
+
+typedef struct _PO_DEVICE_NOTIFY_ORDER
+{
+    ULONG DevNodeSequence;
+    PDEVICE_OBJECT *WarmEjectPdoPointer;
+    PO_NOTIFY_ORDER_LEVEL OrderLevel[8];
+} PO_DEVICE_NOTIFY_ORDER, *PPO_DEVICE_NOTIFY_ORDER;
+
+typedef struct _POP_DEVICE_SYS_STATE
+{
+    UCHAR IrpMinor;
+    SYSTEM_POWER_STATE SystemState;
+    PKEVENT Event;
+    KSPIN_LOCK SpinLock;
+    PKTHREAD Thread;
+    BOOLEAN GetNewDeviceList;
+    PO_DEVICE_NOTIFY_ORDER Order;
+    NTSTATUS Status;
+    PDEVICE_OBJECT FailedDevice;
+    BOOLEAN Waking;
+    BOOLEAN Cancelled;
+    BOOLEAN IgnoreErrors;
+    BOOLEAN IgnoreNotImplemented;
+    BOOLEAN _WaitAny;
+    BOOLEAN _WaitAll;
+    LIST_ENTRY PresentIrpQueue;
+    POP_DEVICE_POWER_IRP Head;
+    POP_DEVICE_POWER_IRP PowerIrpState[20];
+} POP_DEVICE_SYS_STATE, *PPOP_DEVICE_SYS_STATE;
+
+typedef struct _POP_POWER_ACTION
+{
+    UCHAR Updates;
+    UCHAR State;
+    BOOLEAN Shutdown;
+    POWER_ACTION Action;
+    SYSTEM_POWER_STATE LightestState;
+    ULONG Flags;
+    NTSTATUS Status;
+    UCHAR IrpMinor;
+    SYSTEM_POWER_STATE SystemState;
+    SYSTEM_POWER_STATE NextSystemState;
+    PPOP_SHUTDOWN_BUG_CHECK ShutdownBugCode;
+    PPOP_DEVICE_SYS_STATE DevState;
+    PPOP_HIBER_CONTEXT HiberContext;
+    ULONGLONG WakeTime;
+    ULONGLONG SleepTime;
+} POP_POWER_ACTION, *PPOP_POWER_ACTION;
+
+typedef enum _POP_DEVICE_IDLE_TYPE
+{
+    DeviceIdleNormal,
+    DeviceIdleDisk,
+} POP_DEVICE_IDLE_TYPE, *PPOP_DEVICE_IDLE_TYPE;
+
+typedef struct _POWER_CHANNEL_SUMMARY
+{
+    ULONG Signature;
+    ULONG TotalCount;
+    ULONG D0Count;
+    LIST_ENTRY NotifyList;
+} POWER_CHANNEL_SUMMARY, *PPOWER_CHANNEL_SUMMARY;
+    
+typedef struct  _DEVICE_OBJECT_POWER_EXTENSION
+{
+    ULONG IdleCount;
+    ULONG ConservationIdleTime;
+    ULONG PerformanceIdleTime;
+    PDEVICE_OBJECT DeviceObject;
+    LIST_ENTRY IdleList;
+    DEVICE_POWER_STATE State;
+    LIST_ENTRY NotifySourceList;
+    LIST_ENTRY NotifyTargetList;
+    POWER_CHANNEL_SUMMARY PowerChannelSummary;
+    LIST_ENTRY Volume;
+} DEVICE_OBJECT_POWER_EXTENSION, *PDEVICE_OBJECT_POWER_EXTENSION;
+
+//
+// Initialization routines
+//
+BOOLEAN
+NTAPI
+PoInitSystem(
+    IN ULONG BootPhase
+);
 
 VOID
-PoInit(PLOADER_PARAMETER_BLOCK LoaderBlock, BOOLEAN ForceAcpiDisable);
+NTAPI
+PoInitializePrcb(
+    IN PKPRCB Prcb
+);
 
+//
+// I/O Routines
+//
+VOID
+NTAPI
+PoInitializeDeviceObject(
+    IN OUT PDEVOBJ_EXTENSION DeviceObjectExtension
+);
+
+VOID
+NTAPI
+PoVolumeDevice(
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+//
+// Power State routines
+//
 NTSTATUS
+NTAPI
 PopSetSystemPowerState(
-  SYSTEM_POWER_STATE PowerState);
+    SYSTEM_POWER_STATE PowerState
+);
+
+VOID
+NTAPI
+PopCleanupPowerState(
+    IN PPOWER_STATE PowerState
+);
+
+NTSTATUS
+NTAPI
+PopAddRemoveSysCapsCallback(
+    IN PVOID NotificationStructure,
+    IN PVOID Context
+);
+
+//
+// Notifications
+//
+VOID
+NTAPI
+PoNotifySystemTimeSet(
+    VOID
+);
+
+//
+// Shutdown routines
+//
+VOID
+NTAPI
+PopReadShutdownPolicy(
+    VOID
+);
+
+VOID
+NTAPI
+PopGracefulShutdown(
+    IN PVOID Context
+);
+
+VOID
+NTAPI
+PopFlushVolumes(
+    IN BOOLEAN ShuttingDown
+);
+
+//
+// Global data inside the Power Manager
+//
+extern PDEVICE_NODE PopSystemPowerDeviceNode;
+extern KGUARDED_MUTEX PopVolumeLock;
+extern LIST_ENTRY PopVolumeDevices;
+extern KSPIN_LOCK PopDopeGlobalLock;
+extern POP_POWER_ACTION PopAction;
 
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_PO_H */