NtRaiseHardError
Genera un 'hard error' que el kernel enruta a CSRSS para mostrar — o, con SeShutdownPrivilege y severidad FATAL, dispara un bugcheck inmediato (BSOD).
Prototipo
NTSTATUS NtRaiseHardError( NTSTATUS ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask, PULONG_PTR Parameters, HARDERROR_RESPONSE_OPTION ResponseOption, PHARDERROR_RESPONSE Response );
Argumentos
| Name | Type | Dir | Description |
|---|---|---|---|
| ErrorStatus | NTSTATUS | in | Código de estado; los bits altos codifican la severidad (STATUS_SEVERITY_FATAL = clase 0xC0000000 con bit 30 activado dispara la vía bugcheck). |
| NumberOfParameters | ULONG | in | Número de entradas en Parameters (máx 4). |
| UnicodeStringParameterMask | ULONG | in | Bitmask que indica cuáles entradas de Parameters apuntan a UNICODE_STRING (en lugar de ULONG_PTR crudo). |
| Parameters | PULONG_PTR | in | Array de hasta 4 parámetros de sustitución para la plantilla de error. |
| ResponseOption | HARDERROR_RESPONSE_OPTION | in | Qué conjunto de respuestas ofrecer al usuario. OptionShutdownSystem (6) es el valor que dispara el BSOD con severidad FATAL y SeShutdownPrivilege. |
| Response | PHARDERROR_RESPONSE | out | Recibe la respuesta elegida por el usuario. Irrelevante en la vía BSOD porque la llamada nunca retorna. |
IDs de syscalls por versión de Windows
| Versión 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 |
Módulo del kernel
APIs relacionadas
Stub del 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
Notas no documentadas
NtRaiseHardError tiene dos personalidades completamente distintas según las combinaciones de parámetros. La vía benigna envía un mensaje LPC de hard-error a CSRSS, que pinta el familiar diálogo 'Un dispositivo conectado al sistema no funciona'. La famosa vía BSOD: pasar cualquier status STATUS_SEVERITY_FATAL (dos bits altos = 11), ResponseOption = OptionShutdownSystem (6), y mantener SeShutdownPrivilege habilitado — el kernel salta directamente a ExpRaiseHardError → KeBugCheckEx con código de bugcheck 0xF4 (CRITICAL_OBJECT_TERMINATION) o 0xC1 (SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION) según el status. Wininit.exe y Csrss.exe usan legítimamente la misma llamada para apagar el sistema cuando muere un proceso crítico; el malware se monta en la misma maquinaria.
Uso común por malware
La primitiva clásica de 'tirar la máquina desde modo usuario'. El ransomware usa NtRaiseHardError como etapa 3 anti-forense: tras completar el cifrado y borrar instantáneas, forzar un BSOD para interrumpir cualquier forense de memoria, sesión de live-response de EDR o intento de recuperación. Algunos wipers destructivos (HermeticWiper, CaddyWiper) lo invocan como acción final para que el siguiente arranque caiga en WinRE sin volumen de usuario utilizable. Las familias de evasión de defensas también usan la forma no-FATAL para generar diálogos convincentes de 'actualización crítica' en cadenas de ingeniería social. La barrera de privilegio es leve — cualquier proceso ejecutándose como Administrador con SeShutdownPrivilege habilitado por defecto puede BSOD el host.
Oportunidades de detección
Activar el bit de política de auditoría 'Creación de procesos' sobre wininit.exe y csrss.exe, y adicionalmente usar ETW Microsoft-Windows-Threat-Intelligence (EtwTiLogRaiseHardError donde esté expuesto). En la vía superviviente, el canal Application registra hard errors como Event ID 1023 (DrWatson) y el canal System registra BugCheck (Event ID 1001) en el reinicio tras un bugcheck inducido por hard-error. La prevención más útil es eliminar SeShutdownPrivilege de cuentas de servicio no privilegiadas — la mayoría no lo necesitan, y eliminarlo neutraliza la amenaza de BSOD desde modo usuario por completo.
Ejemplos de syscalls directos
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 ENDPMapeos MITRE ATT&CK
Last verified: 2026-05-20