> Windows Syscalls
ntoskrnl.exeT1529T1485T1106

NtShutdownSystem

Déclencheur d'arrêt mode noyau — éteint, redémarre ou arrête le système en un syscall.

Prototype

NTSTATUS NtShutdownSystem(
  SHUTDOWN_ACTION Action  // 0 = ShutdownNoReboot, 1 = ShutdownReboot, 2 = ShutdownPowerOff
);

Arguments

NameTypeDirDescription
ActionSHUTDOWN_ACTIONin0 = ShutdownNoReboot (arrête l'OS à l'écran 'Vous pouvez éteindre'), 1 = ShutdownReboot, 2 = ShutdownPowerOff.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070x198win10-1507
Win10 16070x1A1win10-1607
Win10 17030x1A7win10-1703
Win10 17090x1AAwin10-1709
Win10 18030x1ACwin10-1803
Win10 18090x1ADwin10-1809
Win10 19030x1AEwin10-1903
Win10 19090x1AEwin10-1909
Win10 20040x1B4win10-2004
Win10 20H20x1B4win10-20h2
Win10 21H10x1B4win10-21h1
Win10 21H20x1B6win10-21h2
Win10 22H20x1B6win10-22h2
Win11 21H20x1BFwin11-21h2
Win11 22H20x1C3win11-22h2
Win11 23H20x1C3win11-23h2
Win11 24H20x1C6win11-24h2
Server 20160x1A1winserver-2016
Server 20190x1ADwinserver-2019
Server 20220x1BCwinserver-2022
Server 20250x1C6winserver-2025

Module noyau

ntoskrnl.exeNtShutdownSystem

APIs liées

ExitWindowsExInitiateShutdownWInitiateSystemShutdownExWNtRaiseHardErrorNtSetSystemPowerState

Stub du syscall

4C 8B D1            mov r10, rcx
B8 C6 01 00 00      mov eax, 0x1C6
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

Notes non documentées

NtShutdownSystem est la primitive d'arrêt la plus brute que Windows expose au user mode. Contrairement à `ExitWindowsEx` / `InitiateShutdownW`, il ne notifie *pas* les processus, ne broadcast pas `WM_QUERYENDSESSION`, n'exécute pas les scripts d'arrêt, n'honore pas les pending file renames — il file droit vers `PoInitiateSystemShutdown` et abat le noyau avec le `SHUTDOWN_ACTION` choisi. Le token appelant doit détenir `SeShutdownPrivilege`, que les utilisateurs interactifs ont par défaut mais que les tokens de service ou contrôlés par malware ont *rarement* — l'attaquant doit en général `AdjustTokenPrivileges` pour l'activer d'abord. `ShutdownNoReboot` (0) laisse la machine sur l'écran legacy 'Vous pouvez maintenant éteindre' et est rare en usage malveillant ; `ShutdownReboot` (1) et `ShutdownPowerOff` (2) sont les choix pratiques.

Usage courant par les malwares

Deux schémas d'abus distincts. **Wipers** : HermeticWiper (DEV-0586 / FoxBlade), IsaacWiper, CaddyWiper et WhisperGate écrasent le MBR/MFT puis appellent une primitive d'arrêt pour forcer la visibilité de l'état non bootable — NtShutdownSystem est l'option la plus bas niveau et contourne l'UI d'arrêt user-mode. **Ransomware post-chiffrement** : certaines variantes Conti, LockBit 3.0 ('Black') et BlackCat (ALPHV) redémarrent l'hôte après que le chiffreur termine pour que l'utilisateur voie le fond de note de rançon et que le desktop soit irrécupérable avant reboot. Les wipers le préfèrent quand la furtivité est déjà abandonnée ; les ransomwares préfèrent souvent `InitiateShutdownW` avec REASON_PLANNED pour paraître plus légitimes pendant la fenêtre brève avant reboot.

Opportunités de détection

`Microsoft-Windows-Kernel-General` Event ID 13 se déclenche à l'arrêt et inclut le processus initiateur — précieux pour le post-mortem d'un wiper. Event Log 1074 (User32) enregistre les arrêts type `ExitWindowsEx` *avec* leur initiateur ; un arrêt piloté par NtShutdownSystem ne génèrera *pas* Event 1074 parce que user32 n'était jamais sur le chemin — cette absence est en soi un signal utile. `Microsoft-Windows-Wininit` Event 1 enregistre la phase de début d'arrêt. Les EDR hookent fréquemment `ntdll!NtShutdownSystem` ou la version kernel directement parce que la baseline d'appelants légitimes se résume à `winlogon.exe`, `csrss.exe`, `wininit.exe` et une poignée d'outils de gestion — tout le reste est à fort signal.

Exemples de syscalls directs

asmx64 direct stub

; Direct syscall stub for NtShutdownSystem (SSN 0x1C6 on Win11 24H2)
NtShutdownSystem PROC
    mov  r10, rcx          ; SHUTDOWN_ACTION
    mov  eax, 1C6h         ; SSN — verify per-build
    syscall
    ret
NtShutdownSystem ENDP

cWiper-style hard reboot

// Final stage of a destructive payload: enable SeShutdownPrivilege and reboot.
#include <windows.h>
#include <winternl.h>

typedef NTSTATUS (NTAPI *pNtShutdownSystem)(int /*SHUTDOWN_ACTION*/);

void HardReboot(void) {
    HANDLE hTok;
    TOKEN_PRIVILEGES tp = {0};
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hTok);
    LookupPrivilegeValueW(NULL, L"SeShutdownPrivilege", &tp.Privileges[0].Luid);
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hTok, FALSE, &tp, 0, NULL, NULL);
    CloseHandle(hTok);

    pNtShutdownSystem fn = (pNtShutdownSystem)GetProcAddress(
        GetModuleHandleA("ntdll.dll"), "NtShutdownSystem");
    fn(1 /* ShutdownReboot */);   // no WM_QUERYENDSESSION, no shutdown scripts
}

rustPower-off path

// Cargo: ntapi = "0.4", windows-sys = "0.59"
use ntapi::ntpoapi::NtShutdownSystem;
use ntapi::ntpoapi::SHUTDOWN_ACTION;

unsafe fn power_off() -> i32 {
    // SeShutdownPrivilege must already be enabled on the calling token.
    NtShutdownSystem(SHUTDOWN_ACTION::ShutdownPowerOff as i32)
}

Mappings MITRE ATT&CK

Last verified: 2026-05-20