> Windows Syscalls
ntoskrnl.exeT1485T1529T1106

NtRaiseHardError

Lève une « erreur dure » que le noyau achemine vers CSRSS pour affichage — ou, avec SeShutdownPrivilege et sévérité FATAL, déclenche un bugcheck immédiat (BSOD).

Prototype

NTSTATUS NtRaiseHardError(
  NTSTATUS                 ErrorStatus,
  ULONG                    NumberOfParameters,
  ULONG                    UnicodeStringParameterMask,
  PULONG_PTR               Parameters,
  HARDERROR_RESPONSE_OPTION ResponseOption,
  PHARDERROR_RESPONSE      Response
);

Arguments

NameTypeDirDescription
ErrorStatusNTSTATUSinCode de statut ; les bits hauts encodent la sévérité (STATUS_SEVERITY_FATAL = classe 0xC0000000 avec bit 30 actif déclenche la voie bugcheck).
NumberOfParametersULONGinNombre d'entrées dans Parameters (max 4).
UnicodeStringParameterMaskULONGinBitmask indiquant lesquelles des entrées Parameters pointent sur UNICODE_STRING (plutôt que ULONG_PTR brut).
ParametersPULONG_PTRinTableau d'au plus 4 paramètres de substitution pour le modèle d'erreur.
ResponseOptionHARDERROR_RESPONSE_OPTIONinQuel ensemble de réponses proposer à l'utilisateur. OptionShutdownSystem (6) est la valeur qui déclenche le BSOD avec sévérité FATAL et SeShutdownPrivilege.
ResponsePHARDERROR_RESPONSEoutReçoit la réponse choisie par l'utilisateur. Non pertinent sur la voie BSOD car l'appel ne revient jamais.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070x14Dwin10-1507
Win10 16070x154win10-1607
Win10 17030x15Awin10-1703
Win10 17090x15Dwin10-1709
Win10 18030x15Fwin10-1803
Win10 18090x160win10-1809
Win10 19030x161win10-1903
Win10 19090x161win10-1909
Win10 20040x167win10-2004
Win10 20H20x167win10-20h2
Win10 21H10x167win10-21h1
Win10 21H20x169win10-21h2
Win10 22H20x169win10-22h2
Win11 21H20x170win11-21h2
Win11 22H20x173win11-22h2
Win11 23H20x173win11-23h2
Win11 24H20x175win11-24h2
Server 20160x154winserver-2016
Server 20190x160winserver-2019
Server 20220x16Ewinserver-2022
Server 20250x175winserver-2025

Module noyau

ntoskrnl.exeNtRaiseHardError

APIs liées

RtlAdjustPrivilegeExitWindowsExInitiateSystemShutdownExWNtShutdownSystemNtTerminateProcess

Stub du syscall

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

NtRaiseHardError a deux personnalités totalement différentes selon les combinaisons de paramètres. La voie bénigne poste un message LPC d'erreur dure à CSRSS, qui peint la familière boîte « Un périphérique connecté au système ne fonctionne pas ». La fameuse voie BSOD : passer n'importe quel statut STATUS_SEVERITY_FATAL (deux bits hauts = 11), ResponseOption = OptionShutdownSystem (6), et garder SeShutdownPrivilege activé — le noyau saute directement dans ExpRaiseHardError → KeBugCheckEx avec le code de bugcheck 0xF4 (CRITICAL_OBJECT_TERMINATION) ou 0xC1 (SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION) selon le statut. Wininit.exe et Csrss.exe utilisent légitimement le même appel pour faire tomber le système quand un processus critique meurt ; les malwares se greffent sur la même mécanique.

Usage courant par les malwares

La primitive classique « planter la machine depuis le user-mode ». Les rançongiciels utilisent NtRaiseHardError comme étape 3 d'anti-forensique : après chiffrement complet et effacement des copies d'ombre, forcer un BSOD pour perturber toute forensique mémoire, session de live-response EDR, ou tentative de récupération. Certains wipers destructifs (HermeticWiper, CaddyWiper) l'appellent comme action finale pour que le prochain boot atterrisse dans WinRE sans volume utilisateur exploitable. Les familles à évasion de défense utilisent aussi la forme non-FATAL pour générer des dialogues « mise à jour critique » convaincants dans des chaînes d'ingénierie sociale. La barrière de privilège est faible — tout processus tournant en Administrator avec SeShutdownPrivilege activé par défaut peut BSOD l'hôte.

Opportunités de détection

Activer le bit de stratégie d'audit « Création de processus » sur wininit.exe et csrss.exe, et utiliser en complément ETW Microsoft-Windows-Threat-Intelligence (EtwTiLogRaiseHardError là où exposé). Sur la voie survivable, le journal Application enregistre les erreurs dures comme Event ID 1023 (DrWatson) et le canal Système enregistre BugCheck (Event ID 1001) au redémarrage après un bugcheck induit par hard-error. La prévention la plus utile est de retirer SeShutdownPrivilege aux comptes de service non privilégiés — la plupart n'en ont pas besoin, et le retrait neutralise totalement la menace de BSOD userland.

Exemples de syscalls directs

cUserland BSOD trigger

// Requires SeShutdownPrivilege enabled in the token.
// Result: instant 0xF4 CRITICAL_OBJECT_TERMINATION bugcheck.
BOOLEAN wasEnabled;
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &wasEnabled);

ULONG response;
NtRaiseHardError(
    STATUS_ASSERTION_FAILURE,    // 0xC0000420 - severity FATAL
    0, 0, NULL,
    OptionShutdownSystem,        // 6 -> kernel routes to KeBugCheckEx
    &response);
// Never returns.

cBogus 'critical update' dialog

// Non-FATAL severity -> CSRSS displays a hard-error dialog with template text.
UNICODE_STRING msg;
RtlInitUnicodeString(&msg, L"Critical Windows component compromised. Restart now.");
ULONG_PTR params[1] = { (ULONG_PTR)&msg };
ULONG response;
NtRaiseHardError(
    STATUS_FATAL_APP_EXIT,
    1,
    1,                   // bit 0 = first param is a UNICODE_STRING*
    params,
    OptionOk,
    &response);

asmx64 stub (Win11 24H2)

NtRaiseHardError PROC
    mov  r10, rcx
    mov  eax, 175h         ; Win11 24H2 SSN
    syscall
    ret
NtRaiseHardError ENDP

Mappings MITRE ATT&CK

Last verified: 2026-05-20