1use winapi::shared::ntdef::{
2 BOOLEAN, HANDLE, LONG, NTSTATUS, PLONG, PUNICODE_STRING, PVOID, UCHAR, ULONG, UNICODE_STRING,
3 USHORT,
4};
5use winapi::um::winnt::{
6 DEVICE_POWER_STATE, EXECUTION_STATE, LATENCY_TIME, PDEVICE_POWER_STATE, PEXECUTION_STATE,
7 POWER_ACTION, POWER_INFORMATION_LEVEL, SYSTEM_POWER_STATE,
8};
9UNION!{union POWER_STATE {
10 SystemState: SYSTEM_POWER_STATE,
11 DeviceState: DEVICE_POWER_STATE,
12}}
13pub type PPOWER_STATE = *mut POWER_STATE;
14ENUM!{enum POWER_STATE_TYPE {
15 SystemPowerState = 0,
16 DevicePowerState = 1,
17}}
18pub type PPOWER_STATE_TYPE = *mut POWER_STATE_TYPE;
19STRUCT!{struct SYSTEM_POWER_STATE_CONTEXT {
20 ContextAsUlong: ULONG,
21}}
22BITFIELD!{SYSTEM_POWER_STATE_CONTEXT ContextAsUlong: ULONG [
23 Reserved1 set_Reserved1[0..8],
24 TargetSystemState set_TargetSystemState[8..12],
25 EffectiveSystemState set_EffectiveSystemState[12..16],
26 CurrentSystemState set_CurrentSystemState[16..20],
27 IgnoreHibernationPath set_IgnoreHibernationPath[20..21],
28 PseudoTransition set_PseudoTransition[21..22],
29 Reserved2 set_Reserved2[22..32],
30]}
31pub type PSYSTEM_POWER_STATE_CONTEXT = *mut SYSTEM_POWER_STATE_CONTEXT;
32STRUCT!{struct COUNTED_REASON_CONTEXT_u_s {
33 ResourceFileName: UNICODE_STRING,
34 ResourceReasonId: USHORT,
35 StringCount: ULONG,
36 ReasonStrings: PUNICODE_STRING,
37}}
38UNION!{union COUNTED_REASON_CONTEXT_u {
39 s: COUNTED_REASON_CONTEXT_u_s,
40 SimpleString: UNICODE_STRING,
41}}
42STRUCT!{struct COUNTED_REASON_CONTEXT {
43 Version: ULONG,
44 Flags: ULONG,
45 u: COUNTED_REASON_CONTEXT_u,
46}}
47pub type PCOUNTED_REASON_CONTEXT = *mut COUNTED_REASON_CONTEXT;
48ENUM!{enum POWER_STATE_HANDLER_TYPE {
49 PowerStateSleeping1 = 0,
50 PowerStateSleeping2 = 1,
51 PowerStateSleeping3 = 2,
52 PowerStateSleeping4 = 3,
53 PowerStateShutdownOff = 4,
54 PowerStateShutdownReset = 5,
55 PowerStateSleeping4Firmware = 6,
56 PowerStateMaximum = 7,
57}}
58pub type PPOWER_STATE_HANDLER_TYPE = *mut POWER_STATE_HANDLER_TYPE;
59FN!{stdcall PENTER_STATE_SYSTEM_HANDLER(
60 SystemContext: PVOID,
61) -> NTSTATUS}
62FN!{stdcall PENTER_STATE_HANDLER(
63 Context: PVOID,
64 SystemHandler: PENTER_STATE_SYSTEM_HANDLER,
65 SystemContext: PVOID,
66 NumberProcessors: LONG,
67 Number: PLONG,
68) -> NTSTATUS}
69STRUCT!{struct POWER_STATE_HANDLER {
70 Type: POWER_STATE_HANDLER_TYPE,
71 RtcWake: BOOLEAN,
72 Spare: [UCHAR; 3],
73 Handler: PENTER_STATE_HANDLER,
74 Context: PVOID,
75}}
76pub type PPOWER_STATE_HANDLER = *mut POWER_STATE_HANDLER;
77FN!{stdcall PENTER_STATE_NOTIFY_HANDLER(
78 State: POWER_STATE_HANDLER_TYPE,
79 Context: PVOID,
80 Entering: BOOLEAN,
81) -> NTSTATUS}
82STRUCT!{struct POWER_STATE_NOTIFY_HANDLER {
83 Handler: PENTER_STATE_NOTIFY_HANDLER,
84 Context: PVOID,
85}}
86pub type PPOWER_STATE_NOTIFY_HANDLER = *mut POWER_STATE_NOTIFY_HANDLER;
87STRUCT!{struct PROCESSOR_POWER_INFORMATION {
88 Number: ULONG,
89 MaxMhz: ULONG,
90 CurrentMhz: ULONG,
91 MhzLimit: ULONG,
92 MaxIdleState: ULONG,
93 CurrentIdleState: ULONG,
94}}
95pub type PPROCESSOR_POWER_INFORMATION = *mut PROCESSOR_POWER_INFORMATION;
96STRUCT!{struct SYSTEM_POWER_INFORMATION {
97 MaxIdlenessAllowed: ULONG,
98 Idleness: ULONG,
99 TimeRemaining: ULONG,
100 CoolingMode: UCHAR,
101}}
102pub type PSYSTEM_POWER_INFORMATION = *mut SYSTEM_POWER_INFORMATION;
103EXTERN!{extern "system" {
104 fn NtPowerInformation(
105 InformationLevel: POWER_INFORMATION_LEVEL,
106 InputBuffer: PVOID,
107 InputBufferLength: ULONG,
108 OutputBuffer: PVOID,
109 OutputBufferLength: ULONG,
110 ) -> NTSTATUS;
111 fn NtSetThreadExecutionState(
112 NewFlags: EXECUTION_STATE,
113 PreviousFlags: PEXECUTION_STATE,
114 ) -> NTSTATUS;
115 fn NtRequestWakeupLatency(
116 latency: LATENCY_TIME,
117 ) -> NTSTATUS;
118 fn NtInitiatePowerAction(
119 SystemAction: POWER_ACTION,
120 LightestSystemState: SYSTEM_POWER_STATE,
121 Flags: ULONG,
122 Asynchronous: BOOLEAN,
123 ) -> NTSTATUS;
124 fn NtSetSystemPowerState(
125 SystemAction: POWER_ACTION,
126 LightestSystemState: SYSTEM_POWER_STATE,
127 Flags: ULONG,
128 ) -> NTSTATUS;
129 fn NtGetDevicePowerState(
130 Device: HANDLE,
131 State: PDEVICE_POWER_STATE,
132 ) -> NTSTATUS;
133 fn NtIsSystemResumeAutomatic() -> BOOLEAN;
134}}