/*++ BUILD Version: 0002 Copyright (c) 1995 Microsoft Corporation Module Name: pop.h Abstract: This module contains the private structure definitions and APIs used by the NT Power Manager. Author: Revision History: --*/ #ifndef _POP_ #define _POP_ #ifndef FAR #define FAR #endif #pragma warning(disable:4214) // bit field types other than int #pragma warning(disable:4201) // nameless struct/union #pragma warning(disable:4324) // alignment sensitive to declspec #pragma warning(disable:4127) // condition expression is constant #pragma warning(disable:4115) // named type definition in parentheses #pragma warning(disable:4706) // assignment within conditional #include "ntos.h" #include "ntiolog.h" #include "ntiologc.h" #include "poclass.h" #include "zwapi.h" #include "wdmguid.h" #include "..\io\ioverifier.h" #define NOEXTAPI #include "wdbgexts.h" #include "ntdbg.h" // // constants // #define PO_IDLE_SCAN_INTERVAL 1 // scan interval in seconds // // Values for ios.Parameters.SystemContext #define POP_NO_CONTEXT 0 #define POP_FLAG_CONTEXT 1 // if true, it's flags #define POP_DEVICE_REQUEST (0x2 | POP_FLAG_CONTEXT) // an irp sent by RequestPowerChange #define POP_INRUSH_CONTEXT (0x4 | POP_FLAG_CONTEXT) // the active INRUSH irp #define POP_COUNT_CONTEXT 0xff000000 // byte used for next counting #define POP_COUNT_SHIFT 24 // // pool tags // #define POP_DOPE_TAG 'EPOD' // Device Object Power Extension #define POP_POWI_TAG 'IWOP' // power work item #define POP_THRM_TAG 'mrhT' #define POP_PSWT_TAG 'twSP' #define POP_PSTA_TAG 'atsP' #define POP_PDSS_TAG 'ssDP' #define POP_VOLF_TAG 'floV' #define POP_HMAP_TAG 'pamH' #define POP_CLON_TAG 'NOLC' #define POP_HIBR_TAG 'rbih' #define POP_IDLE_TAG 'eldi' #define POP_DPC_TAG 'PDNP' // power abort dpc #define POP_PNCS_TAG 'SCNP' // power channel summary #define POP_PNSC_TAG 'CSNP' // power notify source #define POP_PNTG_TAG 'GTNP' // power notify target #define POP_PNB_TAG ' BNP' // power notify block // tags used in hiber process #define POP_MEM_TAG ' meM' #define POP_DEBUG_RANGE_TAG 'RGBD' #define POP_DEBUGGER_TAG ' gbD' #define POP_STACK_TAG 'cats' #define POP_PCR_TAG ' rcp' #define POP_PCRB_TAG 'brcp' #define POP_COMMON_BUFFER_TAG 'fubc' #define POP_MEMIMAGE_TAG 'gmiM' #define POP_PACW_TAG 'WcAP' #define POP_NONO 'ONON' // freed structure, compare with pool // tag to see what it was // debugging #define PopInternalError(a) _PopInternalError( (a << 16) | __LINE__ ) // Bugcheck sub-codes #define POP_IRP 1 #define POP_INTERNAL 2 #define POP_NTAPI 3 #define POP_BATT 4 #define POP_THERMAL 5 #define POP_INFO 6 #define POP_MISC 7 #define POP_SYS 8 #define POP_IDLE 9 #define POP_HIBER 10 // bugcheck reason codes #define DEVICE_DELETED_WITH_POWER_IRPS 1 #define DEVICE_SYSTEM_STATE_HUNG 2 #define DEVICE_IRP_PENDING_ERROR 3 // // Debug // #if DBG extern ULONG PoDebug; #define PoPrint(l,m) if(l & PoDebug) DbgPrint m #define PoAssert(l,m) if(l & PoDebug) ASSERT(m) #else #define PoPrint(l,m) #define PoAssert(l,m) #endif #define PO_ERROR 0x00000001 #define PO_WARN 0x00000002 #define PO_BATT 0x00000004 #define PO_PACT 0x00000008 #define PO_NOTIFY 0x00000010 #define PO_THERM 0x00000020 #define PO_THROTTLE 0x00000040 #define PO_HIBERNATE 0x00000080 #define PO_POCALL 0x00000200 #define PO_SYSDEV 0x00000400 #define PO_THROTTLE_DETAIL 0x10000000 #define PO_THERM_DETAIL 0x20000000 #define PO_SIDLE 0x40000000 #define PO_HIBER_MAP 0x80000000 extern ULONG PopSimulate; #define POP_SIM_CAPABILITIES 0x00000001 #define POP_SIM_ALL_CAPABILITIES 0x00000002 #define POP_ALLOW_AC_THROTTLE 0x00000004 #define POP_IGNORE_S1 0x00000008 #define POP_IGNORE_UNSUPPORTED_DRIVERS 0x00000010 #define POP_IGNORE_S3 0x00000020 #define POP_IGNORE_S2 0x00000040 #define POP_LOOP_ON_FAILED_DRIVERS 0x00000080 #define POP_CRC_MEMORY 0x00000100 #define POP_IGNORE_CRC_FAILURES 0x00000200 #define POP_TEST_CRC_MEMORY 0x00000400 #define POP_DEBUG_HIBER_FILE 0x00000800 #define POP_RESET_ON_HIBER 0x00001000 #define POP_IGNORE_S4 0x00002000 //#define POP_USE_S4BIOS 0x00004000 #define POP_IGNORE_HIBER_SYMBOL_UNLOAD 0x00008000 #define POP_ENABLE_HIBER_PERF 0x00010000 #define POP_WAKE_DEVICE_AFTER_SLEEP 0x00020000 #define POP_WAKE_DEADMAN 0x00040000 // // These hold the current values for the power policy // extern ULONG PopIdleDefaultMinThrottle; extern ULONG PopIdleThrottleCheckRate; extern ULONG PopIdleThrottleCheckTimeout; extern ULONG PopIdleFrom0Delay; extern ULONG PopIdleFrom0IdlePercent; extern ULONG PopIdle0PromoteTicks; extern ULONG PopIdle0PromoteLimit; extern ULONG PopIdle0TimeCheck; extern ULONG PopIdleTimeCheck; extern ULONG PopIdleTo0Percent; extern ULONG PopIdleDefaultDemotePercent; extern ULONG PopIdleDefaultDemoteTime; extern ULONG PopIdleDefaultPromotePercent; extern ULONG PopIdleDefaultPromoteTime; extern ULONG PopIdleDefaultDemoteToC1Percent; extern ULONG PopIdleDefaultDemoteToC1Time; extern ULONG PopIdleDefaultPromoteFromC1Percent; extern ULONG PopIdleDefaultPromoteFromC1Time; // // These hold the current values for the throttle policy // extern ULONG PopPerfTimeDelta; extern ULONG PopPerfTimeTicks; extern ULONG PopPerfCriticalTimeDelta; extern ULONG PopPerfCriticalTimeTicks; extern ULONG PopPerfCriticalFrequencyDelta; extern ULONG PopPerfIncreasePercentModifier; extern ULONG PopPerfIncreaseAbsoluteModifier; extern ULONG PopPerfDecreasePercentModifier; extern ULONG PopPerfDecreaseAbsoluteModifier; extern ULONG PopPerfIncreaseTimeValue; extern ULONG PopPerfIncreaseMinimumTime; extern ULONG PopPerfDecreaseTimeValue; extern ULONG PopPerfDecreaseMinimumTime; extern ULONG PopPerfDegradeThrottleMinCapacity; extern ULONG PopPerfDegradeThrottleMinFrequency; extern ULONG PopPerfMaxC3Frequency; // // Universal Power Data - stored in DeviceObject->DeviceObjectExtension->PowerFlags // #define POPF_SYSTEM_STATE 0xf // 4 bits for S0 to S5 #define POPF_DEVICE_STATE 0xf0 // 4 bits to hold D0 to D3 #define POPF_SYSTEM_ACTIVE 0x100 // True if S irp active at this DO #define POPF_SYSTEM_PENDING 0x200 // True if S irp pending (0x100 must be 1) #define POPF_DEVICE_ACTIVE 0x400 // same as SYSTEM_ACTIVE but for DEVICE #define POPF_DEVICE_PENDING 0x800 // same as SYSTEM_PENDING but for DEVICE #define PopSetDoSystemPowerState(doe, value) \ {doe->PowerFlags &= ~POPF_SYSTEM_STATE; doe->PowerFlags |= (value & POPF_SYSTEM_STATE);} #define PopGetDoSystemPowerState(doe) \ (doe->PowerFlags & POPF_SYSTEM_STATE) #define PopSetDoDevicePowerState(doe, value) \ {doe->PowerFlags &= ~POPF_DEVICE_STATE; doe->PowerFlags |= ((value << 4) & POPF_DEVICE_STATE);} #define PopGetDoDevicePowerState(doe) \ ((doe->PowerFlags & POPF_DEVICE_STATE) >> 4) DEVICE_POWER_STATE PopLockGetDoDevicePowerState( IN PDEVOBJ_EXTENSION Doe ); // // Power work queue item declaration // // // Power Irp Serialization data // extern KSPIN_LOCK PopIrpSerialLock; extern LIST_ENTRY PopIrpSerialList; extern ULONG PopIrpSerialListLength; extern BOOLEAN PopInrushPending; extern PIRP PopInrushIrpPointer; extern LONG PopInrushIrpReferenceCount; #define PopLockIrpSerialList(OldIrql) \ KeAcquireSpinLock(&PopIrpSerialLock, OldIrql); #define PopUnlockIrpSerialList(OldIrql) \ KeReleaseSpinLock(&PopIrpSerialLock, OldIrql); // // PopSystemIrpDispatchWorker control, etc // extern KSPIN_LOCK PopWorkerLock; extern ULONG PopCallSystemState; #define PO_CALL_SYSDEV_QUEUE 0x01 #define PO_CALL_NON_PAGED 0x02 extern LIST_ENTRY PopRequestedIrps; #define PopLockWorkerQueue(OldIrql) \ KeAcquireSpinLock(&PopWorkerLock, OldIrql); #define PopUnlockWorkerQueue(OldIrql) \ KeReleaseSpinLock(&PopWorkerLock, OldIrql); // // Idle Detection State // extern KDPC PopIdleScanDpc; extern LARGE_INTEGER PopIdleScanTime; extern KTIMER PopIdleScanTimer; extern LIST_ENTRY PopIdleDetectList; extern KSPIN_LOCK PopDopeGlobalLock; #define PopLockDopeGlobal(OldIrql) \ KeAcquireSpinLock(&PopDopeGlobalLock, OldIrql) #define PopUnlockDopeGlobal(OldIrql) \ KeReleaseSpinLock(&PopDopeGlobalLock, OldIrql) #define PO_IDLE_CONSERVATION FALSE #define PO_IDLE_PERFORMANCE TRUE extern BOOLEAN PopIdleDetectionMode; // // Notify structures // extern ERESOURCE PopNotifyLock; extern ULONG PopInvalidNotifyBlockCount; typedef struct _POWER_CHANNEL_SUMMARY { ULONG Signature; ULONG TotalCount; ULONG D0Count; LIST_ENTRY NotifyList; // or invalid list entry if invalid } POWER_CHANNEL_SUMMARY, *PPOWER_CHANNEL_SUMMARY; typedef struct _DEVICE_OBJECT_POWER_EXTENSION { // embedded idle control variables LONG IdleCount; ULONG ConservationIdleTime; ULONG PerformanceIdleTime; PDEVICE_OBJECT DeviceObject; LIST_ENTRY IdleList; // our link into global idle list UCHAR DeviceType; DEVICE_POWER_STATE State; // notify vars LIST_ENTRY NotifySourceList; // Head of list of source structures, one // element in list for each notify channel // we support. LIST_ENTRY NotifyTargetList; // Mirror to sources list. POWER_CHANNEL_SUMMARY PowerChannelSummary; // record of states of devobjs // that make up power channel // misc LIST_ENTRY Volume; } DEVICE_OBJECT_POWER_EXTENSION, *PDEVICE_OBJECT_POWER_EXTENSION; typedef struct _POWER_NOTIFY_BLOCK { ULONG Signature; LONG RefCount; LIST_ENTRY NotifyList; PPO_NOTIFY NotificationFunction; PVOID NotificationContext; ULONG NotificationType; PPOWER_CHANNEL_SUMMARY PowerChannel; BOOLEAN Invalidated; } POWER_NOTIFY_BLOCK, *PPOWER_NOTIFY_BLOCK; // // Each devobj which is part of a power channel with a notify posted on it // has a list of these structurs. PoSetPowerState runs this list to go find // who to notify // typedef struct _POWER_NOTIFY_SOURCE { ULONG Signature; LIST_ENTRY List; struct _POWER_NOTIFY_TARGET *Target; PDEVICE_OBJECT_POWER_EXTENSION Dope; } POWER_NOTIFY_SOURCE, *PPOWER_NOTIFY_SOURCE; // // There is a target structure for each source structure, the target structure is used // to find the actual notify list, AND to get back to the source structure for cleanup. // typedef struct _POWER_NOTIFY_TARGET { ULONG Signature; LIST_ENTRY List; PPOWER_CHANNEL_SUMMARY ChannelSummary; PPOWER_NOTIFY_SOURCE Source; } POWER_NOTIFY_TARGET, *PPOWER_NOTIFY_TARGET; // // Policy worker thread // There is never more then one worker thread of each type. Dispatching is // is always done via MAIN_POLICY_WORKER type which may then alter its type // to something else to allow another main policy worker thread to start if // needed // #define PO_WORKER_MAIN 0x00000001 #define PO_WORKER_ACTION_PROMOTE 0x00000002 #define PO_WORKER_ACTION_NORMAL 0x00000004 #define PO_WORKER_NOTIFY 0x00000008 #define PO_WORKER_SYS_IDLE 0x00000010 #define PO_WORKER_TIME_CHANGE 0x00000020 #define PO_WORKER_STATUS 0x80000000 typedef ULONG (*POP_WORKER_TYPES) ( VOID ); extern KSPIN_LOCK PopWorkerSpinLock; extern ULONG PopWorkerStatus; extern ULONG PopWorkerPending; extern LONG PopNotifyEvents; // // Policy irp handler // typedef VOID (*POP_IRP_HANDLER) ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); extern const POP_WORKER_TYPES PopWorkerTypes[]; extern LIST_ENTRY PopPolicyIrpQueue; extern WORK_QUEUE_ITEM PopPolicyWorker; // // Notification bits for policy notifcation worker thread // typedef struct { VOID (*Function)(ULONG); ULONG Arg; } POP_NOTIFY_WORK, *PPOP_NOTIFY_WORK; #define PO_NOTIFY_BUTTON_RECURSE 0x00000001 #define PO_NOTIFY_FULL_WAKE 0x00000002 #define PO_NOTIFY_POLICY_CALLBACK 0x00000004 #define PO_NOTIFY_ACDC_CALLBACK 0x00000008 #define PO_NOTIFY_POLICY 0x00000010 #define PO_NOTIFY_DISPLAY_REQUIRED 0x00000020 #define PO_NOTIFY_BATTERY_STATUS 0x00000040 #define PO_NOTIFY_EVENT_CODES 0x00000080 #define PO_NOTIFY_CAPABILITIES 0x00000100 #define PO_NOTIFY_STATE_FAILURE 0x00000200 #define PO_NOTIFY_PROCESSOR_POLICY_CALLBACK 0x00000400 #define PO_NOTIFY_PROCESSOR_POLICY 0x00000800 #define PO_NUMBER_NOTIFY 12 #define POP_MAX_EVENT_CODES 4 extern ULONG PopEventCode[]; extern BOOLEAN PopDispatchPolicyIrps; // // Types for POP_ACTION_TRIGGER // typedef enum { PolicyDeviceSystemButton, PolicyDeviceThermalZone, PolicyDeviceBattery, PolicyInitiatePowerActionAPI, PolicySetPowerStateAPI, PolicyImmediateDozeS4, PolicySystemIdle } POP_POLICY_DEVICE_TYPE; // // Types of sleep promotion/substitution. // typedef enum { // // Power state is lightened until all alternatives have been exhausted. // SubstituteLightenSleep, // // Power state is lightened until all alternatives have been exhausted. If // no alternatives were available, lightest overall *sleeping* state is // chosen (bounded between S1 and S3.) // SubstituteLightestOverallDownwardBounded, // // Power state is deepened until it is advanced beyond PowerSystemHibernate, // in which case all alternatives have been exhausted. // SubstituteDeepenSleep } POP_SUBSTITUTION_POLICY; // // Wait structure for synchronous triggers // typedef struct _POP_TRIGGER_WAIT { KEVENT Event; NTSTATUS Status; LIST_ENTRY Link; struct _POP_ACTION_TRIGGER *Trigger; } POP_TRIGGER_WAIT, *PPOP_TRIGGER_WAIT; // // Trigger state for something which causes an action // typedef struct _POP_ACTION_TRIGGER { POP_POLICY_DEVICE_TYPE Type; UCHAR Flags; UCHAR Spare[3]; union { struct { ULONG Level; } Battery; PPOP_TRIGGER_WAIT Wait; } ; } POP_ACTION_TRIGGER, *PPOP_ACTION_TRIGGER; #define PO_TRG_USER 0x01 // User action initiated #define PO_TRG_SYSTEM 0x02 // System action initiated #define PO_TRG_SYNC 0x20 // Trigger is synchronous #define PO_TRG_SET 0x80 // Event enabled or disabled // // Structure to track systems power state for policy manager // from composite battery device // #define PO_NUM_POWER_LEVELS 4 typedef struct _POP_COMPOSITE_BATTERY { // // State of composite battery processing // UCHAR State; UCHAR Spare[3]; // // Connection to composite battery // ULONG Tag; // // Battery status and time it was valid // ULONGLONG StatusTime; BATTERY_STATUS Status; // // Battery trigger flags to indicate which discharge // actions have already fired // POP_ACTION_TRIGGER Trigger[PO_NUM_POWER_LEVELS]; // // Battery estimated time and time it was computed // ULONGLONG EstTimeTime; ULONG EstTime; // from battery ULONG AdjustedEstTime; // // Battery information // BATTERY_INFORMATION Info; // // Info on outstanding status request to composite battery. // The state machine for the battery is handled such that // outstanding requests are sent into this structure, then // the "State" field is set (which specifies the request). // We then read info out of this union and fill in the // appropriate field in this POP_COMPOSITE_BATTERY // structure. // PIRP StatusIrp; union { ULONG Tag; ULONG EstTime; BATTERY_STATUS Status; BATTERY_INFORMATION Info; BATTERY_WAIT_STATUS Wait; BATTERY_QUERY_INFORMATION QueryInfo; } u; // // Info for threads to wait for the current power state to // be computed. // BOOLEAN ThreadWaiting; KEVENT Event; } POP_COMPOSITE_BATTERY; // state values for POP_COMOSITE_BATTERY.State #define PO_CB_NONE 0 #define PO_CB_READ_TAG 1 #define PO_CB_WAIT_TAG 2 #define PO_CB_READ_INFO 3 #define PO_CB_READ_STATUS 4 #define PO_CB_READ_EST_TIME 5 #define PO_MAX_CB_CACHE_TIME 50000000 // 5 seconds extern POP_COMPOSITE_BATTERY PopCB; // // Structure to track thermal zone state // typedef struct _POP_THERMAL_ZONE { // // List of all thermal zones // LIST_ENTRY Link; // // Current state with driver // UCHAR State; UCHAR Flags; // // Cooling mode of thermal zone // UCHAR Mode; UCHAR PendingMode; // // Active cooling // UCHAR ActivePoint; UCHAR PendingActivePoint; // // Passive cooling state // LONG Throttle; ULONGLONG LastTime; ULONG SampleRate; ULONG LastTemp; KTIMER PassiveTimer; KDPC PassiveDpc; POP_ACTION_TRIGGER OverThrottled; // // Irp for talking with the thermal driver // PIRP Irp; // // Thermal info being read // THERMAL_INFORMATION Info; } POP_THERMAL_ZONE, *PPOP_THERMAL_ZONE; // POP_THERMAL_ZONE.State #define PO_TZ_NO_STATE 0 #define PO_TZ_READ_STATE 1 #define PO_TZ_SET_MODE 2 #define PO_TZ_SET_ACTIVE 3 // POP_THERMAL_ZONE.Flags #define PO_TZ_THROTTLING 0x01 #define PO_TZ_CLEANUP 0x80 #define PO_TZ_THROTTLE_SCALE 10 // temp reported in 1/10ths kelin #define PO_TZ_NO_THROTTLE (100 * PO_TZ_THROTTLE_SCALE) // PopCoolingMode #define PO_TZ_ACTIVE 0 #define PO_TZ_PASSIVE 1 #define PO_TZ_INVALID_MODE 2 // // Action timeouts // #define POP_ACTION_TIMEOUT 30 #define POP_ACTION_CANCEL_TIMEOUT 5 // // Structure to track button & lid devices // typedef struct _POP_SWITCH_DEVICE { // // List of all switch devices // LIST_ENTRY Link; // // Current status // BOOLEAN GotCaps; BOOLEAN IsInitializing; BOOLEAN IsFailed; UCHAR TriggerState; ULONG IrpBuffer; ULONG Caps; // // Only valid for switches that // trigger both opening and shutting. // I.e. a lid switch. // BOOLEAN Opened; } POP_SWITCH_DEVICE, *PPOP_SWITCH_DEVICE; // // Bookkeeping for Thread->PowerState and registered attributes set in the system // typedef struct { LONG Count; VOID (*Set)(ULONG); BOOLEAN NotifyOnClear; ULONG Arg; } POP_STATE_ATTRIBUTE, *PPOP_STATE_ATTRIBUTE; // // N.B. These values correspond to the Log2 of the various // ES_... values as defined in ntpoapi.h. See // PopApplyAttributeState() to see how these values are // dependent on this. // #define POP_SYSTEM_ATTRIBUTE 0 #define POP_DISPLAY_ATTRIBUTE 1 #define POP_USER_ATTRIBUTE 2 #define POP_LOW_LATENCY_ATTRIBUTE 3 #define POP_DISK_SPINDOWN_ATTRIBUTE 4 #define POP_NUMBER_ATTRIBUTES 5 extern POP_STATE_ATTRIBUTE PopAttributes[]; // Flags for Thread->PowerState // ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED // Internal attrib flags // NOTE: this flags are stored in the same flags values as ES_ flags, so they // can not overlapped #define POP_LOW_LATENCY 0x08 #define POP_DISK_SPINDOWN 0x10 // // Presistant settings and heuristics which are not part of the // saved policy structures // typedef struct { ULONG Version; BOOLEAN Dirty; BOOLEAN GetDumpStackVerified; BOOLEAN HiberFileEnabled; // // System idle heuristics // ULONG IoTransferTotal; ULONG IoTransferSamples; ULONG IoTransferWeight; } POP_HEURISTICS, *PPOP_HEURISTICS; extern POP_HEURISTICS PopHeuristics; // // Version 2 of the heuristics was always starting off // with IoTransferWeight set to 99999. This is way too // high and takes quite a while to get down to a reasonable // level. With version three, we are smart enough to treat // IoTransferSamples==0 as the starting point and start off // much closer to reality. // // Version 3 of the heuristics were all built with garbage // values for IoTransferWeight since the IoOtherTransfers // counter is using pointers as values. So we upgrade that // version as well. // // Version 4 of the heuristics has the IoOtherTransfers removed. // // Version 5 of the heuristics is the current version and is built // with the corrected IoOtherTransfers. // // When a version 2, 3, or 4 heuristics is loaded from the registry, // we upgrade it to 5, and zero the IoTransferSamples. // #define POP_HEURISTICS_VERSION_CLEAR_TRANSFER 0x04 #define POP_HEURISTICS_VERSION 0x05 typedef struct _POP_SHUTDOWN_BUG_CHECK { ULONG Code; ULONG_PTR Parameter1; ULONG_PTR Parameter2; ULONG_PTR Parameter3; ULONG_PTR Parameter4; } POP_SHUTDOWN_BUG_CHECK, *PPOP_SHUTDOWN_BUG_CHECK; // // Memory map information // typedef struct _POP_MEMORY_RANGE { LIST_ENTRY Link; ULONG Tag; PFN_NUMBER StartPage; PFN_NUMBER EndPage; PVOID CloneVa; } POP_MEMORY_RANGE, *PPOP_MEMORY_RANGE; // // Attention: not exceed HIBER_PTES in boot\inc\bldr.h // #define POP_MAX_MDL_SIZE 16 #define PO_MAX_MAPPED_CLONES (64*1024*1024) #define POP_FREE_THRESHOLD 256 // Leave 1MB to 2MB on the free list #define POP_FREE_ALLOCATE_SIZE (256) // allocate 1024kb at a time typedef struct _POP_HIBER_CONTEXT { // // Flags which control the type of hiber operation // BOOLEAN WriteToFile; BOOLEAN ReserveLoaderMemory; BOOLEAN ReserveFreeMemory; BOOLEAN VerifyOnWake; BOOLEAN Reset; UCHAR HiberFlags; // // Hibernate link file // BOOLEAN LinkFile; HANDLE LinkFileHandle; // // Map of memory pages and how they should be handled // during the hibernate operation // KSPIN_LOCK Lock; BOOLEAN MapFrozen; RTL_BITMAP MemoryMap; LIST_ENTRY ClonedRanges; ULONG ClonedRangeCount; // // placeholders for enumerating through the ranges // PLIST_ENTRY NextCloneRange; PFN_NUMBER NextPreserve; // // Pages of memory collected out of the system // PMDL LoaderMdl; PMDL Clones; PUCHAR NextClone; PFN_NUMBER NoClones; PMDL Spares; ULONGLONG PagesOut; // // hiber file io // PVOID IoPage; PVOID CurrentMcb; PDUMP_STACK_CONTEXT DumpStack; PKPROCESSOR_STATE WakeState; // // Misc // ULONG NoRanges; ULONG_PTR HiberVa; PHYSICAL_ADDRESS HiberPte; NTSTATUS Status; // // For generating the image // PPO_MEMORY_IMAGE MemoryImage; PPO_MEMORY_RANGE_ARRAY TableHead; // Compression PUCHAR CompressionWorkspace; PUCHAR CompressedWriteBuffer; PULONG PerformanceStats; // Performance Stats PVOID CompressionBlock; // It's of COMPRESSION_BLOCK type (see hiber.c) PVOID DmaIO; // It's of IOREGIONS type (see hiber.c) PVOID TemporaryHeap; // It's of POP_HIBER_HEAP type (see hiber.c) // // Perf info // PO_HIBER_PERF PerfInfo; } POP_HIBER_CONTEXT, *PPOP_HIBER_CONTEXT; extern ULONG PopMaxPageRun; extern BOOLEAN PoHiberInProgress; extern BOOLEAN PopFailedHibernationAttempt; // we tried to hibernate and failed. typedef struct { HANDLE FileHandle; PFILE_OBJECT FileObject; PFN_NUMBER FilePages; PLARGE_INTEGER NonPagedMcb; PLARGE_INTEGER PagedMcb; ULONG McbSize; ULONG McbCheck; } POP_HIBER_FILE, *PPOP_HIBER_FILE; extern POP_HIBER_FILE PopHiberFile; extern POP_HIBER_FILE PopHiberFileDebug; // // Policy manager action in progress state // #define MAX_SYSTEM_POWER_IRPS 20 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 _POP_DEVICE_SYS_STATE { // // Current device notification // UCHAR IrpMinor; SYSTEM_POWER_STATE SystemState; // // Device notification synchronization // KEVENT Event; KSPIN_LOCK SpinLock; PKTHREAD Thread; // // Notification list // BOOLEAN GetNewDeviceList; PO_DEVICE_NOTIFY_ORDER Order; // // Current device notification state // NTSTATUS Status; PDEVICE_OBJECT FailedDevice; BOOLEAN Waking; BOOLEAN Cancelled; BOOLEAN IgnoreErrors; BOOLEAN IgnoreNotImplemented; BOOLEAN WaitAny; BOOLEAN WaitAll; // // PoCall's present irp queue for pagable irp // LIST_ENTRY PresentIrpQueue; // // Head pointers // POP_DEVICE_POWER_IRP Head; // // Structure to track each outstanding device power irp // POP_DEVICE_POWER_IRP PowerIrpState[MAX_SYSTEM_POWER_IRPS]; } POP_DEVICE_SYS_STATE, *PPOP_DEVICE_SYS_STATE; // // Tests to see if any POWER_ACTION.Flags are set that shouldn't be // #define ARE_POWER_ACTION_POLICY_FLAGS_BOGUS(_flags) ( (_flags) & \ ~(POWER_ACTION_QUERY_ALLOWED | \ POWER_ACTION_UI_ALLOWED | \ POWER_ACTION_OVERRIDE_APPS | \ POWER_ACTION_LIGHTEST_FIRST | \ POWER_ACTION_LOCK_CONSOLE | \ POWER_ACTION_DISABLE_WAKES | \ POWER_ACTION_CRITICAL) ) typedef struct _POP_POWER_ACTION { // // Current state of power action // UCHAR Updates; UCHAR State; BOOLEAN Shutdown; // // Current desired power action // 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; // // Current state of device notifiations for the system state // PPOP_DEVICE_SYS_STATE DevState; // // Hibernation context // PPOP_HIBER_CONTEXT HiberContext; // // For debugging. The last state which worked and when // SYSTEM_POWER_STATE LastWakeState; ULONGLONG WakeTime; ULONGLONG SleepTime; } POP_POWER_ACTION, *PPOP_POWER_ACTION; // // PO_PM_USER - Update to action which effects usermode, but if the current // operation is passed to NtSetSystemPowerState or happens to complete, these // updates can be ignored // // PO_PM_REISSUE - Update to the action which effects the system. // // PO_PM_SETSTATE - Update to the action which effects NtSetSystemPowerState // #define PO_PM_USER 0x01 // nice to inform user mode, but not needed #define PO_PM_REISSUE 0x02 // sleep promotoed to shutdown #define PO_PM_SETSTATE 0x04 // recomputed something to do with the viable state #define PO_ACT_IDLE 0 #define PO_ACT_NEW_REQUEST 1 #define PO_ACT_CALLOUT 2 #define PO_ACT_SET_SYSTEM_STATE 3 extern POP_POWER_ACTION PopAction; extern LIST_ENTRY PopActionWaiters; // // // extern LONG PopFullWake; #define PO_FULL_WAKE_STATUS 0x01 #define PO_FULL_WAKE_PENDING 0x02 #define PO_GDI_STATUS 0x04 #define PO_GDI_ON_PENDING 0x08 #define AllBitsSet(a,b) ( ((a) & (b)) == (b) ) #define AnyBitsSet(a,b) ( (a) & (b) ) // // Misc constants // #define PO_NO_FORCED_THROTTLE 100 #define PO_NO_FAN_THROTTLE 100 #define PO_MAX_FAN_THROTTLE 20 #define PO_MIN_MIN_THROTTLE 20 #define PO_MIN_IDLE_TIMEOUT 60 #define PO_MIN_IDLE_SENSITIVITY 10 // // Processor idle handler info // typedef struct _POP_IDLE_HANDLER { ULONG Latency; ULONG TimeCheck; ULONG DemoteLimit; ULONG PromoteLimit; ULONG PromoteCount; UCHAR Demote; UCHAR Promote; UCHAR PromotePercent; UCHAR DemotePercent; UCHAR State; UCHAR Spare[3]; PPROCESSOR_IDLE_HANDLER IdleFunction; } POP_IDLE_HANDLER, *PPOP_IDLE_HANDLER; #define MAX_IDLE_HANDLER 3 #define PO_IDLE_COMPLETE_DEMOTION (0) #define PO_IDLE_THROTTLE_PROMOTION (MAX_IDLE_HANDLER+1) #define US2TIME 10L // scale microseconds by 10 to get 100ns #define US2SEC 1000000L #define MAXSECCHECK 10L // max wait below is 10s typedef struct _POP_SYSTEM_IDLE { // // Current idle settings // LONG Idleness; ULONG Time; ULONG Timeout; ULONG Sensitivity; POWER_ACTION_POLICY Action; SYSTEM_POWER_STATE MinState; // // Current idle stats // BOOLEAN IdleWorker; BOOLEAN Sampling; ULONGLONG LastTick; ULONGLONG LastIoTransfer; ULONG LastIoCount; } POP_SYSTEM_IDLE, *PPOP_SYSTEM_IDLE; // // System idle worker once every 15 seconds. // N.B. value must divide into 60secs evenly // #define SYS_IDLE_WORKER 15 // 15 seconds #define SYS_IDLE_CHECKS_PER_MIN (60/SYS_IDLE_WORKER) #define SYS_IDLE_SAMPLES 240 // 1hr worth of samples #define SYS_IDLE_IO_SCALER 100 // defaults for system idle detection on a system wake used // to re-enter a system sleep when a full wake does not occur #define SYS_IDLE_REENTER_SENSITIVITY 80 #define SYS_IDLE_REENTER_TIMEOUT (2*60) // 2 minutes #define SYS_IDLE_REENTER_TIMEOUT_S4 (5*60) // 5 minutes // // even if someone tells us a user is present, // if we woke up because of the RTC within this // time limit, then assume there really isn't a // user present and go to S4 anyway. // #define SYS_IGNORE_USERPRESENT_AND_BELIEVE_RTC (10) extern POP_SYSTEM_IDLE PopSIdle; extern SYSTEM_POWER_POLICY PopAcPolicy; extern SYSTEM_POWER_POLICY PopDcPolicy; extern PSYSTEM_POWER_POLICY PopPolicy; extern PROCESSOR_POWER_POLICY PopAcProcessorPolicy; extern PROCESSOR_POWER_POLICY PopDcProcessorPolicy; extern PPROCESSOR_POWER_POLICY PopProcessorPolicy; extern POWER_STATE_HANDLER PopPowerStateHandlers[]; extern POWER_STATE_NOTIFY_HANDLER PopPowerStateNotifyHandler; extern const POP_NOTIFY_WORK PopNotifyWork[]; extern PPOP_IDLE_HANDLER PopIdle; extern NPAGED_LOOKASIDE_LIST PopIdleHandlerLookAsideList; extern KEVENT PopDumbyEvent; extern ADMINISTRATOR_POWER_POLICY PopAdminPolicy; extern const WCHAR PopRegKey[]; extern const WCHAR PopAcRegName[]; extern const WCHAR PopDcRegName[]; extern const WCHAR PopAdminRegName[]; extern const WCHAR PopUndockPolicyRegName[]; extern const WCHAR PopHeuristicsRegName[]; extern const WCHAR PopCompositeBatteryName[]; extern const WCHAR PopSimulateRegKey[]; extern const WCHAR PopSimulateRegName[]; extern const WCHAR PopHiberFileName[]; extern const WCHAR PopDebugHiberFileName[]; extern const WCHAR PopDumpStackPrefix[]; extern const WCHAR PopApmActiveFlag[]; extern const WCHAR PopApmFlag[]; extern const WCHAR PopAcProcessorRegName[]; extern const WCHAR PopDcProcessorRegName[]; extern LIST_ENTRY PopSwitches; extern LIST_ENTRY PopThermal; extern KSPIN_LOCK PopThermalLock; extern ULONG PopCoolingMode; extern ULONG PopLowLatency; extern ULONG PopSystemIdleTime; extern PKWIN32_POWEREVENT_CALLOUT PopEventCallout; extern PKWIN32_POWERSTATE_CALLOUT PopStateCallout; extern WORK_QUEUE_ITEM PopUserPresentWorkItem; extern WORK_QUEUE_ITEM PopUnlockAfterSleepWorkItem; extern KEVENT PopUnlockComplete; VOID PopEventCalloutDispatch ( IN PSPOWEREVENTTYPE EventNumber, IN ULONG_PTR Code ); extern LIST_ENTRY PopVolumeDevices; // // Undocking policy info // typedef struct _UNDOCK_POWER_RESTRICTIONS { ULONG Version; ULONG Size; ULONG HotUndockMinimumCapacity; // In percent ULONG SleepUndockMinimumCapacity; // In percent } UNDOCK_POWER_RESTRICTIONS, *PUNDOCK_POWER_RESTRICTIONS; #define SIZEOF_PARTIAL_INFO_HEADER \ FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) #define SIZEOF_EJECT_PARTIAL_INFO \ SIZEOF_PARTIAL_INFO_HEADER + sizeof(UNDOCK_POWER_RESTRICTIONS) // // logging info // extern LIST_ENTRY PowerStateDisableReasonListHead; typedef struct _SYSTEM_POWER_STATE_DISABLE_LIST { LIST_ENTRY ListEntry; PSYSTEM_POWER_STATE_DISABLE_REASON Reason; } SYSTEM_POWER_STATE_DISABLE_LIST, *PSYSTEM_POWER_STATE_DISABLE_LIST; NTSTATUS PopLoggingInformation( OUT PVOID * Buffer, OUT ULONG * BufferSize ); NTSTATUS PopInsertLoggingEntry( IN PSYSTEM_POWER_STATE_DISABLE_REASON Reason ); NTSTATUS PopRemoveReasonRecordByReasonCode( IN ULONG ReasonCode ); // // Prototypes // extern ERESOURCE PopPolicyLock; extern PKTHREAD PopPolicyLockThread; #if DBG #define ASSERT_POLICY_LOCK_OWNED() PopAssertPolicyLockOwned() #else #define ASSERT_POLICY_LOCK_OWNED() #endif extern KGUARDED_MUTEX PopVolumeLock; #define PopAcquireVolumeLock() KeAcquireGuardedMutex(&PopVolumeLock) #define PopReleaseVolumeLock() KeReleaseGuardedMutex(&PopVolumeLock) #define ClearMember(Member, Set) \ Set = Set & (~((ULONG_PTR)1 << (Member))) #if defined(_WIN64) #define InterlockedOrAffinity(Target, Set) { \ LONGLONG _i, _j; \ _j = (*Target); \ do { \ _i = _j; \ _j = InterlockedCompareExchange64((Target), \ (_i | (Set)), \ _i); \ } while (_i != _j) ; \ } #else #define InterlockedOrAffinity(Target, Set) InterlockedOr(Target, Set) #endif // defined(_WIN64) #if defined(_WIN64) #define InterlockedAndAffinity(Target, Set) { \ LONGLONG _i, _j; \ _j = (*Target); \ do { \ _i = _j; \ _j = InterlockedCompareExchange64((Target), \ (_i & (Set)), \ _i); \ } while (_i != _j) ; \ } #else #define InterlockedAndAffinity(Target, Set) InterlockedAnd(Target, Set) #endif // defined(_WIN64) // attrib.c VOID PopApplyAttributeState ( IN ULONG NewFlag, IN ULONG OldFlag ); VOID PopAttribNop ( IN ULONG Arg ); VOID PopSystemRequiredSet ( IN ULONG Arg ); VOID PopDisplayRequired ( IN ULONG Arg ); VOID PopUserPresentSet ( IN ULONG Arg ); // pocall.c VOID PopSystemIrpDispatchWorker( IN BOOLEAN LastCall ); PIRP PopFindIrpByDeviceObject( PDEVICE_OBJECT DeviceObject, POWER_STATE_TYPE Type ); VOID PopSystemIrpsActive ( VOID ); // hiber.c NTSTATUS PopEnableHiberFile ( IN BOOLEAN Enable ); VOID PopCloneStack ( IN PPOP_HIBER_CONTEXT HiberContext ); NTSTATUS PopAllocateHiberContext ( VOID ); VOID PopFreeHiberContext ( BOOLEAN ContextBlock ); NTSTATUS PopBuildMemoryImageHeader ( IN PPOP_HIBER_CONTEXT HiberContext, IN SYSTEM_POWER_STATE SystemState ); NTSTATUS PopSaveHiberContext ( IN PPOP_HIBER_CONTEXT HiberContext ); VOID PopHiberComplete ( IN NTSTATUS Status, IN PPOP_HIBER_CONTEXT HiberContext ); VOID PopFixContext ( OUT PCONTEXT Context ); ULONG PopGatherMemoryForHibernate ( IN PPOP_HIBER_CONTEXT HiberContext, IN PFN_NUMBER NoPages, IN PMDL *Mdl, IN BOOLEAN Wait ); // idle.c VOID PopScanIdleList ( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); PDEVICE_OBJECT_POWER_EXTENSION PopGetDope( IN PDEVICE_OBJECT DeviceObject ); // misc.c VOID FASTCALL PopInternalAddToDumpFile ( IN OPTIONAL PVOID DataBlock, IN OPTIONAL ULONG DataBlockSize, IN OPTIONAL PDEVICE_OBJECT DeviceObject, IN OPTIONAL PDRIVER_OBJECT DriverObject, IN OPTIONAL PDEVOBJ_EXTENSION Doe, IN OPTIONAL PDEVICE_OBJECT_POWER_EXTENSION Dope ); VOID FASTCALL _PopInternalError ( IN ULONG BugCode ); #if DBG VOID PopAssertPolicyLockOwned( VOID ); #endif NTSTATUS PopAttachToSystemProcess ( VOID ); #define PopSetCapability(_pflag_) PopChangeCapability(_pflag_, TRUE) #define PopClearCapability(_pflag_) PopChangeCapability(_pflag_, FALSE) VOID PopChangeCapability( IN PBOOLEAN PresentFlag, IN BOOLEAN IsPresent ); EXCEPTION_DISPOSITION PopExceptionFilter ( IN PEXCEPTION_POINTERS ExceptionInformation, IN BOOLEAN AllowRaisedException ); VOID PopSaveHeuristics ( VOID ); PCHAR PopSystemStateString ( IN SYSTEM_POWER_STATE SystemState ); #if DBG PCHAR PopPowerActionString ( IN POWER_ACTION PowerAction ); #endif NTSTATUS PopOpenPowerKey ( OUT PHANDLE handle ); VOID PopInitializePowerPolicySimulate( VOID ); VOID PopUnlockAfterSleepWorker( IN PVOID NotUsed ); // paction.c VOID PopCriticalShutdown ( POP_POLICY_DEVICE_TYPE Type ); VOID PopSetPowerAction ( IN PPOP_ACTION_TRIGGER Trigger, IN ULONG UserNotify, IN PPOWER_ACTION_POLICY ActionPolicy, IN SYSTEM_POWER_STATE LightestState, IN POP_SUBSTITUTION_POLICY SubstitutionPolicy ); LONG PopCompareActions( POWER_ACTION FutureAction, POWER_ACTION CurrentAction ); ULONG PopPolicyWorkerAction ( VOID ); ULONG PopPolicyWorkerActionPromote ( VOID ); VOID PopResetActionDefaults( VOID ); VOID PopActionRetrieveInitialState( IN OUT PSYSTEM_POWER_STATE LightestSystemState, OUT PSYSTEM_POWER_STATE DeepestSystemState, OUT PSYSTEM_POWER_STATE InitialSystemState, OUT PBOOLEAN QueryDevices ); // pbatt.c VOID PopCompositeBatteryDeviceHandler ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); NTSTATUS PopCurrentPowerState ( OUT PSYSTEM_BATTERY_STATE PowerState ); VOID PopResetCBTriggers ( UCHAR Flags ); // switch.c VOID PopLidHandler ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID PopSystemButtonHandler ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID PopResetSwitchTriggers ( VOID ); // pidle.c VOID PopInitProcessorStateHandlers ( IN PPROCESSOR_STATE_HANDLER InputBuffer ); VOID PopInitProcessorStateHandlers2 ( IN PPROCESSOR_STATE_HANDLER2 InputBuffer ); NTSTATUS PopIdleSwitchIdleHandler( IN PPOP_IDLE_HANDLER NewHandler, IN ULONG NumElements ); NTSTATUS PopIdleSwitchIdleHandlers( IN PPOP_IDLE_HANDLER NewHandler, IN ULONG NumElements ); NTSTATUS PopIdleUpdateIdleHandler( IN PPOP_IDLE_HANDLER NewHandler, IN PPOP_IDLE_HANDLER OldHandler, IN ULONG NumElements ); NTSTATUS PopIdleUpdateIdleHandlers( VOID ); NTSTATUS PopIdleVerifyIdleHandlers( IN PPOP_IDLE_HANDLER NewHandler, IN ULONG NumElements ); VOID PopProcessorInformation ( OUT PPROCESSOR_POWER_INFORMATION ProcInfo, IN ULONG ProcInfoLength, OUT PULONG ReturnBufferLength ); // pinfo.c BOOLEAN PopVerifyPowerActionPolicy ( IN PPOWER_ACTION_POLICY Action ); VOID PopVerifySystemPowerState ( IN OUT PSYSTEM_POWER_STATE PowerState, IN POP_SUBSTITUTION_POLICY SubstitutionPolicy ); VOID PopAdvanceSystemPowerState ( IN OUT PSYSTEM_POWER_STATE PowerState, IN POP_SUBSTITUTION_POLICY SubstitutionPolicy, IN SYSTEM_POWER_STATE LightestSystemState, IN SYSTEM_POWER_STATE DeepestSystemState ); NTSTATUS PopNotifyPolicyDevice ( IN PVOID Notification, IN PVOID Context ); NTSTATUS PopApplyAdminPolicy ( IN BOOLEAN UpdateRegistry, IN PADMINISTRATOR_POWER_POLICY NewPolicy, IN ULONG PolicyLength ); NTSTATUS PopResetCurrentPolicies ( VOID ); VOID PopConnectToPolicyDevice ( IN POP_POLICY_DEVICE_TYPE DeviceType, IN PUNICODE_STRING DriverName ); POWER_ACTION PopMapInternalActionToIrpAction ( IN POWER_ACTION Action, IN SYSTEM_POWER_STATE SystemPowerState, IN BOOLEAN UnmapWarmEject ); // poinit.c VOID PopDefaultPolicy ( IN OUT PSYSTEM_POWER_POLICY Policy ); VOID PopDefaultProcessorPolicy( IN OUT PPROCESSOR_POWER_POLICY Policy ); // postate.c VOID PopRequestPowerChange ( IN PDEVOBJ_EXTENSION PowerExtension, IN POWER_STATE SystemPowerState, IN ULONG DevicePowerState ); VOID PopStateChange ( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); NTSTATUS PopSetPowerComplete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); #define PopIsStateDatabaseIdle() \ (IsListEmpty (&PopStateChangeInProgress) && \ IsListEmpty (&PopSyncStateChangeQueue) && \ IsListEmpty (&PopAsyncStateChangeQueue) ) // pwork.c VOID PopAcquirePolicyLock( VOID ); VOID PopReleasePolicyLock( IN BOOLEAN CheckForWork ); VOID PopGetPolicyWorker ( IN ULONG WorkerType ); VOID PopCheckForWork ( IN BOOLEAN GetWorker ); NTSTATUS PopCompletePolicyIrp ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID PopPolicyWorkerThread ( PVOID Context ); ULONG PopPolicyWorkerMain ( VOID ); VOID PopSetNotificationWork ( IN ULONG Flags ); ULONG PopPolicyWorkerNotify ( VOID ); ULONG PopPolicyTimeChange ( VOID ); VOID PopDispatchCallback ( IN ULONG Arg ); VOID PopDispatchAcDcCallback ( IN ULONG Arg ); VOID PopDispatchCallout ( IN ULONG Arg ); VOID PopDispatchProcessorPolicyCallout ( IN ULONG Arg ); VOID PopDispatchPolicyCallout ( IN ULONG Arg ); VOID PopDispatchDisplayRequired ( IN ULONG Arg ); VOID PopDispatchFullWake ( IN ULONG Arg ); VOID PopDispatchEventCodes ( IN ULONG Arg ); VOID PopDispatchSetStateFailure ( IN ULONG Arg ); // sidle.c VOID PopInitSIdle ( VOID ); ULONG PopPolicySystemIdle ( VOID ); // sys.c DECLSPEC_NORETURN VOID PopShutdownSystem ( IN POWER_ACTION SystemAction ); NTSTATUS PopSleepSystem ( IN SYSTEM_POWER_STATE SystemState, IN PVOID Memory ); VOID PopCheckIdleDevState ( IN PPOP_DEVICE_SYS_STATE DevState, IN BOOLEAN LogErrors, IN BOOLEAN FreeAll ); VOID PopRestartSetSystemState ( VOID ); NTSTATUS PopShutdownHandler ( IN PVOID Context, IN PENTER_STATE_SYSTEM_HANDLER SystemHandler OPTIONAL, IN PVOID SystemContext, IN LONG NumberProcessors, IN volatile PLONG Number ); // sysdev.c VOID PopAllocateDevState( VOID ); VOID PopCleanupDevState ( VOID ); VOID PopReportDevState ( IN BOOLEAN LogErrors ); NTSTATUS PopSetDevicesSystemState ( IN BOOLEAN Wake ); VOID PopLogNotifyDevice ( IN PDEVICE_OBJECT TargetDevice, IN OPTIONAL PPO_DEVICE_NOTIFY Notify, IN PIRP Irp ); // thermal.c PUCHAR PopTimeString( OUT PUCHAR TimeString, IN ULONGLONG CurrentTime ); VOID PopThermalDeviceHandler ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID PopThermalZoneDpc ( IN struct _KDPC *Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); VOID PopApplyThermalThrottle ( VOID ); // // throttle.c - dynamic CPU voltage throttling // // // scale that performance levels are kept in. This is the units in the // PROCESSOR_PERF_LEVEL scale and what is used internally to track CPU // performance levels. // #define POP_PERF_SCALE POWER_PERF_SCALE #define POP_CUR_TIME(X) (X->KernelTime + X->UserTime) UCHAR PopCalculateBusyPercentage( IN PPROCESSOR_POWER_STATE PState ); UCHAR PopCalculateC3Percentage( IN PPROCESSOR_POWER_STATE PState ); VOID PopCalculatePerfDecreaseLevel( IN PPROCESSOR_PERF_STATE PerfStates, IN ULONG PerfStatesCount ); VOID PopCalculatePerfIncreaseDecreaseTime( IN PPROCESSOR_PERF_STATE PerfStates, IN ULONG PerfStatesCount, IN PPROCESSOR_STATE_HANDLER2 PerfHandler ); VOID PopCalculatePerfIncreaseLevel( IN PPROCESSOR_PERF_STATE PerfStates, IN ULONG PerfStatesCount ); VOID PopCalculatePerfMinCapacity( IN PPROCESSOR_PERF_STATE PerfStates, IN ULONG PerfStatesCount ); UCHAR PopGetThrottle( VOID ); VOID PopPerfHandleInrush( IN BOOLEAN EnableHandler ); VOID PopPerfIdle( IN PPROCESSOR_POWER_STATE PState ); VOID PopPerfIdleDpc( IN PKDPC Dpc, IN PVOID DpcContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); VOID PopRoundThrottle( IN UCHAR Throttle, OUT OPTIONAL PUCHAR RoundDown, OUT OPTIONAL PUCHAR RoundUp, OUT OPTIONAL PUCHAR RoundDownIndex, OUT OPTIONAL PUCHAR RoundUpIndex ); VOID PopSetPerfFlag( IN ULONG PerfFlag, IN BOOLEAN Clear ); NTSTATUS PopSetPerfLevels( IN PPROCESSOR_STATE_HANDLER2 ProcessorHandler ); NTSTATUS PopSetThrottle( IN PPROCESSOR_POWER_STATE PState, IN PPROCESSOR_PERF_STATE PerfStates, IN ULONG Index, IN ULONG SystemTime, IN ULONG IdleTime ); NTSTATUS PopSetTimer( IN PPROCESSOR_POWER_STATE PState, IN UCHAR Index ); // // Some globals that thunk the old processor throttling callout into the // new one. // NTSTATUS FASTCALL PopThunkSetThrottle( IN UCHAR Throttle ); VOID PopUpdateAllThrottles( VOID ); VOID PopUpdateProcessorThrottle( VOID ); extern PSET_PROCESSOR_THROTTLE PopRealSetThrottle; extern UCHAR PopThunkThrottleScale; extern LARGE_INTEGER PopPerfCounterFrequency; // volume.c VOID PopFlushVolumes ( VOID ); // notify.c VOID PopStateChangeNotify( PDEVICE_OBJECT DeviceObject, ULONG NotificationType ); VOID PopRunDownSourceTargetList( PDEVICE_OBJECT DeviceObject ); // poshtdwn.c NTSTATUS PopInitShutdownList ( VOID ); DECLSPEC_NORETURN VOID PopGracefulShutdown ( IN PVOID WorkItemParameter ); #endif // _POP_