Skip to main content

ntapi/
ntpoapi.rs

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}}