* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
+#include "initguid.h"
#include <poclass.h>
//
#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
//
IN PKPRCB Prcb
);
+//
+// I/O Routines
+//
+VOID
+NTAPI
+PoInitializeDeviceObject(
+ IN OUT PDEVOBJ_EXTENSION DeviceObjectExtension
+);
+
+VOID
+NTAPI
+PoVolumeDevice(
+ IN PDEVICE_OBJECT DeviceObject
+);
+
//
// Power State routines
//
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;
+