> Windows Syscalls
ntoskrnl.exeT1529T1485T1497

NtInitiatePowerAction

Solicita al power manager realizar una acción de energía a nivel de sistema (suspensión, hibernación, apagado, reinicio).

Prototipo

NTSTATUS NtInitiatePowerAction(
  POWER_ACTION       SystemAction,
  SYSTEM_POWER_STATE MinSystemState,
  ULONG              Flags,
  BOOLEAN            Asynchronous
);

Argumentos

NameTypeDirDescription
SystemActionPOWER_ACTIONinAcción a realizar: Sleep, Hibernate, Shutdown, ShutdownReset, ShutdownOff, WarmEject, DisplayOff.
MinSystemStateSYSTEM_POWER_STATEinEstado objetivo mínimo aceptable (PowerSystemWorking..PowerSystemShutdown).
FlagsULONGinFlags POWER_ACTION_* que controlan la política: QUERY_ALLOWED, UI_ALLOWED, OVERRIDE_APPS, DISABLE_WAKES, CRITICAL.
AsynchronousBOOLEANinTRUE devuelve de inmediato; FALSE bloquea hasta que la acción se arbitre completamente.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070xF1win10-1507
Win10 16070xF5win10-1607
Win10 17030xF8win10-1703
Win10 17090xF9win10-1709
Win10 18030xFAwin10-1803
Win10 18090xFBwin10-1809
Win10 19030xFCwin10-1903
Win10 19090xFCwin10-1909
Win10 20040x101win10-2004
Win10 20H20x101win10-20h2
Win10 21H10x101win10-21h1
Win10 21H20x102win10-21h2
Win10 22H20x102win10-22h2
Win11 21H20x107win11-21h2
Win11 22H20x108win11-22h2
Win11 23H20x108win11-23h2
Win11 24H20x10Awin11-24h2
Server 20160xF5winserver-2016
Server 20190xFBwinserver-2019
Server 20220x106winserver-2022
Server 20250x10Awinserver-2025

Módulo del kernel

ntoskrnl.exeNtInitiatePowerAction

APIs relacionadas

InitiatePowerActionWSetSuspendStateExitWindowsExInitiateShutdownWNtSetSystemPowerStateSetSystemPowerState

Stub del syscall

4C 8B D1            mov r10, rcx
B8 0A 01 00 00      mov eax, 0x10A
F6 04 25 08 03 FE 7F 01   test byte ptr [0x7FFE0308], 1
75 03               jne short +3
0F 05               syscall
C3                  ret
CD 2E               int 2Eh
C3                  ret

Notas no documentadas

Punto de entrada de alto nivel para acciones de energía: `InitiatePowerActionW`, `SetSuspendState` (vía powrprof.dll), `ExitWindowsEx` (para variantes shutdown/reboot) y los fast-paths de Modern Standby rutean por aquí. A diferencia de `NtSetSystemPowerState`, esta función pasa por el **power policy manager**: difunde WM_POWERBROADCAST / PBT_APMQUERYSUSPEND a los procesos, honra `QUERY_ALLOWED` (las apps pueden rechazar) y solo entonces delega a `NtSetSystemPowerState` si la política lo permite. Requiere `SeShutdownPrivilege`. El parámetro `Asynchronous` es la perilla operativa crítica — async retorna inmediato y el llamador no puede detectar rechazo; sync bloquea hasta reanudación o veto de driver/app.

Uso común por malware

**El reboot post-cifrado de ransomware** es el abuso dominante. Royal, BlackCat/ALPHV, Conti, LockBit 3.0 y BlackSuit emiten un reboot de clase InitiatePowerAction tras escribir la nota de rescate — el objetivo es empujar a los usuarios hacia la pantalla de recuperación o Windows RE, lo que coloca la nota de rescate de forma fiable y previene un rollback rápido vía Volume Shadow Copies todavía en memoria. **Los wipers** (HermeticWiper, IsaacWiper, WhisperGate, CaddyWiper) disparan análogamente un ShutdownReset para hacer arrancar la máquina con datos de boot corruptos. Una clase más reducida de loaders red-team invoca PowerActionSleep con `DISABLE_WAKES | CRITICAL` para evadir sesiones de sandbox de corta duración. El requisito de privilegio (SeShutdownPrivilege) es trivial para malware en admin o LocalSystem, pero para código usuario poco privilegiado el check falla — la mayoría de ransomware lleva una primitiva de elevación previa.

Oportunidades de detección

El proveedor ETW Microsoft-Windows-Kernel-Power emite eventos estructurados para cada initiate-power-action: PID origen, acción, flags, éxito/fallo. Log de eventos: el log System registra Event ID 1074 para el proceso iniciador de cualquier shutdown/reboot iniciado por usuario (limpio), 6005/6006 para init de service pack, 6008 para shutdowns sucios. La regla conductual más accionable: un proceso que hizo >N escrituras/modificaciones de ficheros en los últimos 60 segundos y luego invoca una acción de energía de clase Shutdown/Reset — es un indicador ransomware casi perfecto. El ajuste de SeShutdownPrivilege desde un token no-interactivo es de por sí inusual y digno de alerta. Los EDR que hookean ntdll ven esta llamada directamente; las variantes con syscall directo evaden ntdll pero igual dejan la traza ETW.

Ejemplos de syscalls directos

asmx64 direct stub (Win11 24H2)

; Direct syscall stub for NtInitiatePowerAction (SSN 0x10A on Win11 24H2)
NtInitiatePowerAction PROC
    mov  r10, rcx          ; syscall convention
    mov  eax, 10Ah         ; SSN — varies per build
    syscall
    ret
NtInitiatePowerAction ENDP

cRansomware post-encryption reboot

// Final step after the encryption pass and ransom-note drop.
// PowerActionShutdownReset = 6 (reboot), PowerSystemShutdown = 6.
// Flags = POWER_ACTION_DISABLE_WAKES | POWER_ACTION_CRITICAL
//          | POWER_ACTION_OVERRIDE_APPS  bypass app refusal.
#include <windows.h>
#include <winternl.h>

typedef NTSTATUS (NTAPI *pNtInitiatePowerAction)(ULONG, ULONG, ULONG, BOOLEAN);

VOID PostEncryptReboot(VOID) {
    pNtInitiatePowerAction NtInitiatePowerAction = (pNtInitiatePowerAction)
        GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtInitiatePowerAction");
    // SeShutdownPrivilege assumed already enabled
    NtInitiatePowerAction(
        /* SystemAction   */ 6,
        /* MinSystemState */ 6,
        /* Flags          */ 0xC0010000, // CRITICAL | DISABLE_WAKES | OVERRIDE_APPS
        /* Asynchronous   */ FALSE);
}

rustSandbox evasion via critical sleep

// Cargo: windows-sys = "0.59"
// Try to put the analysis VM into S3 sleep before the loader's real work runs.
// Async + DISABLE_WAKES prevents most sandbox harnesses from resuming it cleanly.
use windows_sys::Win32::Security::*;
use windows_sys::Win32::System::Threading::*;
use windows_sys::Win32::Foundation::*;

extern "system" {
    fn NtInitiatePowerAction(action: u32, min_state: u32, flags: u32, asynch: u8) -> i32;
}

pub unsafe fn evade_via_sleep() -> i32 {
    let mut tok: HANDLE = std::mem::zeroed();
    OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &mut tok);
    // (omitted: LookupPrivilegeValueW + AdjustTokenPrivileges for SeShutdownPrivilege)
    // PowerActionSleep = 2, PowerSystemSleeping3 = 5
    NtInitiatePowerAction(2, 5, 0x40000000 /* DISABLE_WAKES */, 1)
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20