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
| Name | Type | Dir | Description |
|---|---|---|---|
| ErrorStatus | NTSTATUS | in | Code de statut ; les bits hauts encodent la sévérité (STATUS_SEVERITY_FATAL = classe 0xC0000000 avec bit 30 actif déclenche la voie bugcheck). |
| NumberOfParameters | ULONG | in | Nombre d'entrées dans Parameters (max 4). |
| UnicodeStringParameterMask | ULONG | in | Bitmask indiquant lesquelles des entrées Parameters pointent sur UNICODE_STRING (plutôt que ULONG_PTR brut). |
| Parameters | PULONG_PTR | in | Tableau d'au plus 4 paramètres de substitution pour le modèle d'erreur. |
| ResponseOption | HARDERROR_RESPONSE_OPTION | in | Quel ensemble de réponses proposer à l'utilisateur. OptionShutdownSystem (6) est la valeur qui déclenche le BSOD avec sévérité FATAL et SeShutdownPrivilege. |
| Response | PHARDERROR_RESPONSE | out | Reç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 Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0x14D | win10-1507 |
| Win10 1607 | 0x154 | win10-1607 |
| Win10 1703 | 0x15A | win10-1703 |
| Win10 1709 | 0x15D | win10-1709 |
| Win10 1803 | 0x15F | win10-1803 |
| Win10 1809 | 0x160 | win10-1809 |
| Win10 1903 | 0x161 | win10-1903 |
| Win10 1909 | 0x161 | win10-1909 |
| Win10 2004 | 0x167 | win10-2004 |
| Win10 20H2 | 0x167 | win10-20h2 |
| Win10 21H1 | 0x167 | win10-21h1 |
| Win10 21H2 | 0x169 | win10-21h2 |
| Win10 22H2 | 0x169 | win10-22h2 |
| Win11 21H2 | 0x170 | win11-21h2 |
| Win11 22H2 | 0x173 | win11-22h2 |
| Win11 23H2 | 0x173 | win11-23h2 |
| Win11 24H2 | 0x175 | win11-24h2 |
| Server 2016 | 0x154 | winserver-2016 |
| Server 2019 | 0x160 | winserver-2019 |
| Server 2022 | 0x16E | winserver-2022 |
| Server 2025 | 0x175 | winserver-2025 |
Module noyau
APIs liées
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 ENDPMappings MITRE ATT&CK
Last verified: 2026-05-20