     HPOWERNOTIFY RegistrationHandle
 )
 
+ERROR: win32-powrprof-error n ;
+: win32-power-error ( n -- )
+    dup 0 = [ drop ] [ win32-powrprof-error ] if ;
+
+: get-power-capabilities ( -- struct )
+    SYSTEM_POWER_CAPABILITIES <struct>
+    [ GetPwrCapabilities win32-error=0/f ] keep ;
+
 : get-processor-power-information ( -- structs )
     ProcessorInformation
     f 0
     cpus <PROCESSOR_POWER_INFORMATION-array>
     PROCESSOR_POWER_INFORMATION heap-size cpus *
+    [ CallNtPowerInformation win32-power-error ] keepd ;
+
+: simple-call-nt-power-information ( enum class -- struct )
+    [ f 0 ] dip
+    [ <struct> ] [ heap-size ] bi
+    [ CallNtPowerInformation win32-power-error ] keepd ;
+
+: c-type-call-nt-power-information ( enum c-type -- struct )
     [
-        CallNtPowerInformation win32-error=0/f
-    ] keepd ;
-
-: get-power-capabilities ( -- struct )
-    SYSTEM_POWER_CAPABILITIES <struct>
-    [ GetPwrCapabilities win32-error=0/f ] keep ;
+        [ f 0 ] dip
+        [ 0 swap <ref> ] [ heap-size ] bi
+        [ CallNtPowerInformation win32-power-error ] keepd
+    ] keep deref ; inline
+
+: get-last-sleep-time ( -- nanoseconds )
+    LastSleepTime ULONGLONG c-type-call-nt-power-information 100 * ;
+
+: get-last-wake-time ( -- nanoseconds )
+    LastWakeTime ULONGLONG c-type-call-nt-power-information 100 * ;
+
+: get-system-execuction-state ( -- enum )
+    SystemExecutionState ULONG c-type-call-nt-power-information ;
+
+: get-system-power-capabilities ( -- struct )
+    SystemPowerCapabilities SYSTEM_POWER_CAPABILITIES simple-call-nt-power-information ;
+
+: get-system-battery-state ( -- struct )
+    SystemBatteryState SYSTEM_BATTERY_STATE simple-call-nt-power-information ;
+
+: get-system-power-policy-ac ( -- struct )
+    SystemPowerPolicyAc SYSTEM_POWER_POLICY simple-call-nt-power-information ;
+
+: get-system-power-policy-current ( -- struct )
+    SystemPowerPolicyCurrent SYSTEM_POWER_POLICY simple-call-nt-power-information ;
+
+: get-system-power-policy-dc ( -- struct )
+    SystemPowerPolicyDc SYSTEM_POWER_POLICY simple-call-nt-power-information ;
+

TYPEDEF: void* PHPOWERNOTIFY

CONSTANT: STATUS_SUCCESS 0

ENUM: SYSTEM_POWER_STATE
    PowerSystemUnspecified

    { DefaultLowLatencyWake SYSTEM_POWER_STATE } ;
TYPEDEF: SYSTEM_POWER_CAPABILITIES* PSYSTEM_POWER_CAPABILITIES

ENUM: POWER_ACTION
  PowerActionNone
  PowerActionReserved
  PowerActionSleep
  PowerActionHibernate
  PowerActionShutdown
  PowerActionShutdownReset
  PowerActionShutdownOff
  PowerActionWarmEject
  PowerActionDisplayOff ;
TYPEDEF: POWER_ACTION* PPOWER_ACTION

STRUCT: POWER_ACTION_POLICY
    { Action POWER_ACTION }
    { Flags DWORD }
    { EventCode DWORD } ;
TYPEDEF: POWER_ACTION_POLICY* PPOWER_ACTION_POLICY

CONSTANT: DISCHARGE_POLICY_CRITICAL 0
CONSTANT: DISCHARGE_POLICY_LOW 1
CONSTANT: NUM_DISCHARGE_POLICIES 4

STRUCT: SYSTEM_POWER_LEVEL
    { Enable BOOLEAN }
    { Spare BYTE[3] }
    { BatteryLevel DWORD }
    { PowerPolicy POWER_ACTION_POLICY }
    { MinSystemState SYSTEM_POWER_STATE } ;
TYPEDEF: SYSTEM_POWER_LEVEL* PSYSTEM_POWER_LEVEL

STRUCT: SYSTEM_POWER_POLICY
    { Revision DWORD }
    { PowerButton POWER_ACTION_POLICY }
    { SleepButton POWER_ACTION_POLICY }
    { LidClose POWER_ACTION_POLICY }
    { LidOpenWake SYSTEM_POWER_STATE }
    { Reserved DWORD }
    { Idle POWER_ACTION_POLICY }
    { IdleTimeout DWORD }
    { IdleSensitivity BYTE }
    { DynamicThrottle BYTE }
    { Spare2 BYTE[2] }
    { MinSleep SYSTEM_POWER_STATE }
    { MaxSleep SYSTEM_POWER_STATE }
    { ReducedLatencySleep SYSTEM_POWER_STATE }
    { WinLogonFlags DWORD }
    { Spare3 DWORD }
    { DozeS4Timeout DWORD }
    { BroadcastCapacityResolution DWORD }
    { DischargePolicy SYSTEM_POWER_LEVEL[NUM_DISCHARGE_POLICIES] }
    { VideoTimeout DWORD }
    { VideoDimDisplay BOOLEAN }
    { VideoReserved DWORD[3] }
    { SpindownTimeout DWORD }
    { OptimizeForPower BOOLEAN }
    { FanThrottleTolerance BYTE }
    { ForcedThrottle BYTE }
    { MinThrottle BYTE }
    { OverThrottled POWER_ACTION_POLICY } ;
TYPEDEF: SYSTEM_POWER_POLICY* PSYSTEM_POWER_POLICY


STRUCT: SYSTEM_BATTERY_STATE
    { AcOnLine BOOLEAN }
    { BatteryPresent BOOLEAN }
