1 /* Copyright (C) 2010 Wildfire Games.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining
4  * a copy of this software and associated documentation files (the
5  * "Software"), to deal in the Software without restriction, including
6  * without limitation the rights to use, copy, modify, merge, publish,
7  * distribute, sublicense, and/or sell copies of the Software, and to
8  * permit persons to whom the Software is furnished to do so, subject to
9  * the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included
12  * in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  */
22 
23 /*
24  * bring in powrprof library.
25  */
26 
27 #ifndef INCLUDED_POWRPROF
28 #define INCLUDED_POWRPROF
29 
30 #include "lib/sysdep/os/win/win.h"
31 
32 #include <powrprof.h>
33 
34 // the VC7 headers are missing some parts:
35 
36 // MinGW headers are already correct; only change on VC
37 #if MSC_VERSION && MSC_VERSION < 1400
38 
39 #ifndef NTSTATUS
40 #define NTSTATUS long
41 #endif
42 #ifndef STATUS_SUCCESS
43 #define STATUS_SUCCESS 0
44 #endif
45 
46 #if WINVER < 0x500
47 
48 typedef enum {
49 	SystemPowerPolicyAc,
50 	SystemPowerPolicyDc,
51 	VerifySystemPolicyAc,
52 	VerifySystemPolicyDc,
53 	SystemPowerCapabilities,
54 	SystemBatteryState,
55 	SystemPowerStateHandler,
56 	ProcessorStateHandler,
57 	SystemPowerPolicyCurrent,
58 	AdministratorPowerPolicy,
59 	SystemReserveHiberFile,
60 	ProcessorInformation,
61 	SystemPowerInformation,
62 	ProcessorStateHandler2,
63 	LastWakeTime,                                   // Compare with KeQueryInterruptTime()
64 	LastSleepTime,                                  // Compare with KeQueryInterruptTime()
65 	SystemExecutionState,
66 	SystemPowerStateNotifyHandler,
67 	ProcessorPowerPolicyAc,
68 	ProcessorPowerPolicyDc,
69 	VerifyProcessorPowerPolicyAc,
70 	VerifyProcessorPowerPolicyDc,
71 	ProcessorPowerPolicyCurrent,
72 	SystemPowerStateLogging,
73 	SystemPowerLoggingEntry
74 } POWER_INFORMATION_LEVEL;
75 
76 
77 typedef struct {
78 	DWORD       Granularity;
79 	DWORD       Capacity;
80 } BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
81 
82 typedef enum _SYSTEM_POWER_STATE {
83 	PowerSystemUnspecified = 0,
84 	PowerSystemWorking     = 1,
85 	PowerSystemSleeping1   = 2,
86 	PowerSystemSleeping2   = 3,
87 	PowerSystemSleeping3   = 4,
88 	PowerSystemHibernate   = 5,
89 	PowerSystemShutdown    = 6,
90 	PowerSystemMaximum     = 7
91 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
92 
93 typedef struct {
94 	// Misc supported system features
95 	BOOLEAN             PowerButtonPresent;
96 	BOOLEAN             SleepButtonPresent;
97 	BOOLEAN             LidPresent;
98 	BOOLEAN             SystemS1;
99 	BOOLEAN             SystemS2;
100 	BOOLEAN             SystemS3;
101 	BOOLEAN             SystemS4;           // hibernate
102 	BOOLEAN             SystemS5;           // off
103 	BOOLEAN             HiberFilePresent;
104 	BOOLEAN             FullWake;
105 	BOOLEAN             VideoDimPresent;
106 	BOOLEAN             ApmPresent;
107 	BOOLEAN             UpsPresent;
108 
109 	// Processors
110 	BOOLEAN             ThermalControl;
111 	BOOLEAN             ProcessorThrottle;
112 	BYTE                ProcessorMinThrottle;
113 	BYTE                ProcessorMaxThrottle;
114 	BYTE                spare2[4];
115 
116 	// Disk
117 	BOOLEAN             DiskSpinDown;
118 	BYTE                spare3[8];
119 
120 	// System Battery
121 	BOOLEAN             SystemBatteriesPresent;
122 	BOOLEAN             BatteriesAreShortTerm;
123 	BATTERY_REPORTING_SCALE BatteryScale[3];
124 
125 	// Wake
126 	SYSTEM_POWER_STATE  AcOnLineWake;
127 	SYSTEM_POWER_STATE  SoftLidWake;
128 	SYSTEM_POWER_STATE  RtcWake;
129 	SYSTEM_POWER_STATE  MinDeviceWakeState; // note this may change on driver load
130 	SYSTEM_POWER_STATE  DefaultLowLatencyWake;
131 } SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;
132 
133 #endif	// WINVER < 0x500
134 
135 typedef struct _SYSTEM_POWER_INFORMATION
136 {
137 	ULONG MaxIdlenessAllowed;
138 	ULONG Idleness;
139 	ULONG TimeRemaining;
140 	UCHAR CoolingMode;
141 } SYSTEM_POWER_INFORMATION, *PSYSTEM_POWER_INFORMATION;
142 
143 // SPI.CoolingMode
144 #define PO_TZ_INVALID_MODE 0 // The system does not support CPU throttling,
145 // or there is no thermal zone defined [..]
146 
147 #endif	// #if MSC_VERSION
148 
149 // neither VC7.1 nor MinGW define this
150 typedef struct _PROCESSOR_POWER_INFORMATION
151 {
152 	ULONG Number;
153 	ULONG MaxMhz;
154 	ULONG CurrentMhz;
155 	ULONG MhzLimit;
156 	ULONG MaxIdleState;
157 	ULONG CurrentIdleState;
158 } PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;
159 
160 #endif	// #ifndef INCLUDED_POWRPROF
161