2165 lines
50 KiB
C
2165 lines
50 KiB
C
|
/*++ 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_
|