use winapi::shared::ntdef::{ BOOLEAN, HANDLE, LONG, NTSTATUS, PLONG, PUNICODE_STRING, PVOID, UCHAR, ULONG, UNICODE_STRING, USHORT, }; use winapi::um::winnt::{ DEVICE_POWER_STATE, EXECUTION_STATE, LATENCY_TIME, PDEVICE_POWER_STATE, PEXECUTION_STATE, POWER_ACTION, POWER_INFORMATION_LEVEL, SYSTEM_POWER_STATE, }; UNION!{union POWER_STATE { SystemState: SYSTEM_POWER_STATE, DeviceState: DEVICE_POWER_STATE, }} pub type PPOWER_STATE = *mut POWER_STATE; ENUM!{enum POWER_STATE_TYPE { SystemPowerState = 0, DevicePowerState = 1, }} pub type PPOWER_STATE_TYPE = *mut POWER_STATE_TYPE; STRUCT!{struct SYSTEM_POWER_STATE_CONTEXT { ContextAsUlong: ULONG, }} BITFIELD!{SYSTEM_POWER_STATE_CONTEXT ContextAsUlong: ULONG [ Reserved1 set_Reserved1[0..8], TargetSystemState set_TargetSystemState[8..12], EffectiveSystemState set_EffectiveSystemState[12..16], CurrentSystemState set_CurrentSystemState[16..20], IgnoreHibernationPath set_IgnoreHibernationPath[20..21], PseudoTransition set_PseudoTransition[21..22], Reserved2 set_Reserved2[22..32], ]} pub type PSYSTEM_POWER_STATE_CONTEXT = *mut SYSTEM_POWER_STATE_CONTEXT; STRUCT!{struct COUNTED_REASON_CONTEXT_u_s { ResourceFileName: UNICODE_STRING, ResourceReasonId: USHORT, StringCount: ULONG, ReasonStrings: PUNICODE_STRING, }} UNION!{union COUNTED_REASON_CONTEXT_u { s: COUNTED_REASON_CONTEXT_u_s, SimpleString: UNICODE_STRING, }} STRUCT!{struct COUNTED_REASON_CONTEXT { Version: ULONG, Flags: ULONG, u: COUNTED_REASON_CONTEXT_u, }} pub type PCOUNTED_REASON_CONTEXT = *mut COUNTED_REASON_CONTEXT; ENUM!{enum POWER_STATE_HANDLER_TYPE { PowerStateSleeping1 = 0, PowerStateSleeping2 = 1, PowerStateSleeping3 = 2, PowerStateSleeping4 = 3, PowerStateShutdownOff = 4, PowerStateShutdownReset = 5, PowerStateSleeping4Firmware = 6, PowerStateMaximum = 7, }} pub type PPOWER_STATE_HANDLER_TYPE = *mut POWER_STATE_HANDLER_TYPE; FN!{stdcall PENTER_STATE_SYSTEM_HANDLER( SystemContext: PVOID, ) -> NTSTATUS} FN!{stdcall PENTER_STATE_HANDLER( Context: PVOID, SystemHandler: PENTER_STATE_SYSTEM_HANDLER, SystemContext: PVOID, NumberProcessors: LONG, Number: PLONG, ) -> NTSTATUS} STRUCT!{struct POWER_STATE_HANDLER { Type: POWER_STATE_HANDLER_TYPE, RtcWake: BOOLEAN, Spare: [UCHAR; 3], Handler: PENTER_STATE_HANDLER, Context: PVOID, }} pub type PPOWER_STATE_HANDLER = *mut POWER_STATE_HANDLER; FN!{stdcall PENTER_STATE_NOTIFY_HANDLER( State: POWER_STATE_HANDLER_TYPE, Context: PVOID, Entering: BOOLEAN, ) -> NTSTATUS} STRUCT!{struct POWER_STATE_NOTIFY_HANDLER { Handler: PENTER_STATE_NOTIFY_HANDLER, Context: PVOID, }} pub type PPOWER_STATE_NOTIFY_HANDLER = *mut POWER_STATE_NOTIFY_HANDLER; STRUCT!{struct PROCESSOR_POWER_INFORMATION { Number: ULONG, MaxMhz: ULONG, CurrentMhz: ULONG, MhzLimit: ULONG, MaxIdleState: ULONG, CurrentIdleState: ULONG, }} pub type PPROCESSOR_POWER_INFORMATION = *mut PROCESSOR_POWER_INFORMATION; STRUCT!{struct SYSTEM_POWER_INFORMATION { MaxIdlenessAllowed: ULONG, Idleness: ULONG, TimeRemaining: ULONG, CoolingMode: UCHAR, }} pub type PSYSTEM_POWER_INFORMATION = *mut SYSTEM_POWER_INFORMATION; EXTERN!{extern "system" { fn NtPowerInformation( InformationLevel: POWER_INFORMATION_LEVEL, InputBuffer: PVOID, InputBufferLength: ULONG, OutputBuffer: PVOID, OutputBufferLength: ULONG, ) -> NTSTATUS; fn NtSetThreadExecutionState( NewFlags: EXECUTION_STATE, PreviousFlags: PEXECUTION_STATE, ) -> NTSTATUS; fn NtRequestWakeupLatency( latency: LATENCY_TIME, ) -> NTSTATUS; fn NtInitiatePowerAction( SystemAction: POWER_ACTION, LightestSystemState: SYSTEM_POWER_STATE, Flags: ULONG, Asynchronous: BOOLEAN, ) -> NTSTATUS; fn NtSetSystemPowerState( SystemAction: POWER_ACTION, LightestSystemState: SYSTEM_POWER_STATE, Flags: ULONG, ) -> NTSTATUS; fn NtGetDevicePowerState( Device: HANDLE, State: PDEVICE_POWER_STATE, ) -> NTSTATUS; fn NtIsSystemResumeAutomatic() -> BOOLEAN; }}