NtPulseEvent
Señala un evento, libera los hilos que ya esperan y luego lo restablece a no señalado.
Prototipo
NTSTATUS NtPulseEvent( HANDLE EventHandle, PLONG PreviousState );
Argumentos
| Name | Type | Dir | Description |
|---|---|---|---|
| EventHandle | HANDLE | in | Handle al evento con acceso EVENT_MODIFY_STATE. |
| PreviousState | PLONG | out | Opcional; recibe el estado señalado del evento antes del pulse (1 = señalado, 0 = no). |
IDs de syscalls por versión de Windows
| Versión de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0x127 | win10-1507 |
| Win10 1607 | 0x12D | win10-1607 |
| Win10 1703 | 0x131 | win10-1703 |
| Win10 1709 | 0x133 | win10-1709 |
| Win10 1803 | 0x135 | win10-1803 |
| Win10 1809 | 0x136 | win10-1809 |
| Win10 1903 | 0x137 | win10-1903 |
| Win10 1909 | 0x137 | win10-1909 |
| Win10 2004 | 0x13D | win10-2004 |
| Win10 20H2 | 0x13D | win10-20h2 |
| Win10 21H1 | 0x13D | win10-21h1 |
| Win10 21H2 | 0x13E | win10-21h2 |
| Win10 22H2 | 0x13E | win10-22h2 |
| Win11 21H2 | 0x144 | win11-21h2 |
| Win11 22H2 | 0x146 | win11-22h2 |
| Win11 23H2 | 0x146 | win11-23h2 |
| Win11 24H2 | 0x148 | win11-24h2 |
| Server 2016 | 0x12D | winserver-2016 |
| Server 2019 | 0x136 | winserver-2019 |
| Server 2022 | 0x143 | winserver-2022 |
| Server 2025 | 0x148 | winserver-2025 |
Módulo del kernel
APIs relacionadas
Stub del syscall
4C 8B D1 mov r10, rcx B8 48 01 00 00 mov eax, 0x148 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
NtPulseEvent realiza un *set y luego reset* sobre un objeto evento como una sola operación atómica. Para un evento manual-reset libera a *todos* los hilos que esperan y luego deja inmediatamente el evento en no-señalado, por lo que un hilo que llegue un microsegundo después se pierde el pulso entero. Para un evento sync (auto-reset) libera como mucho un waiter. Microsoft desaconseja desde hace tiempo su uso en user mode porque la ventana señalada es susceptible a carreras: PulseEvent es en gran parte un vestigio del diseño original de NT. El kernel todavía lo implementa (KePulseEvent) y ntoskrnl lo usa internamente en algunas rutas de señalización en ráfaga.
Uso común por malware
Mayoritariamente *legítimo*. Algunos implantes y packers usan una señal pulse para liberar un pool de hilos worker en una sola ráfaga (p. ej. orquestar un pool de descifradores). Como la semántica racy de PulseEvent obliga a que el wait ya esté establecido, los atacantes eligen más a menudo NtSetEvent seguido de NtResetEvent o un semáforo contado. No es una señal de detección significativa por sí misma.
Oportunidades de detección
No es una llamada de alta señal. Microsoft-Windows-Kernel-EventTracing y los eventos de objetos de sincronización no exponen PulseEvent por separado. Los hooks EDR sobre `ntdll!NtPulseEvent` son poco comunes. Investigar solo junto con otras anomalías — por ejemplo un pulso sobre un evento cuyo nombre (visible vía NtQueryObject) parezca sospechoso o imite una primitiva de sincronización conocida.
Ejemplos de syscalls directos
asmx64 direct stub
; Direct syscall stub for NtPulseEvent (SSN 0x148 on Win11 24H2)
NtPulseEvent PROC
mov r10, rcx ; EventHandle
mov eax, 148h ; SSN — verify per-build
syscall
ret
NtPulseEvent ENDPcRelease a burst of waiters
// Wake every thread currently parked on hEvent, then immediately drop signaled state.
#include <windows.h>
#include <winternl.h>
typedef NTSTATUS (NTAPI *pNtPulseEvent)(HANDLE, PLONG);
NTSTATUS PulseBurst(HANDLE hEvent) {
LONG previous = 0;
pNtPulseEvent fn = (pNtPulseEvent)GetProcAddress(
GetModuleHandleA("ntdll.dll"), "NtPulseEvent");
return fn(hEvent, &previous);
}Mapeos MITRE ATT&CK
Last verified: 2026-05-20