> Windows Syscalls
ntoskrnl.exeT1106

NtFlushProcessWriteBuffers

Emite una barrera de memoria global en cada CPU que ejecute hilos del proceso actual.

Prototipo

VOID NtFlushProcessWriteBuffers(VOID);

Argumentos

NameTypeDirDescription

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070xDBwin10-1507
Win10 16070xDEwin10-1607
Win10 17030xE1win10-1703
Win10 17090xE2win10-1709
Win10 18030xE3win10-1803
Win10 18090xE4win10-1809
Win10 19030xE5win10-1903
Win10 19090xE5win10-1909
Win10 20040xEAwin10-2004
Win10 20H20xEAwin10-20h2
Win10 21H10xEAwin10-21h1
Win10 21H20xEBwin10-21h2
Win10 22H20xEBwin10-22h2
Win11 21H20xF0win11-21h2
Win11 22H20xF1win11-22h2
Win11 23H20xF1win11-23h2
Win11 24H20xF3win11-24h2
Server 20160xDEwinserver-2016
Server 20190xE4winserver-2019
Server 20220xEFwinserver-2022
Server 20250xF3winserver-2025

Módulo del kernel

ntoskrnl.exeNtFlushProcessWriteBuffers

APIs relacionadas

FlushProcessWriteBuffersMemoryBarrier_mm_mfenceInterlockedIncrement

Stub del syscall

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

NtFlushProcessWriteBuffers (wrapper Win32 `FlushProcessWriteBuffers`) no devuelve estado y no toma parámetros. Internamente el kernel envía una interrupción inter-procesador (IPI) a cada CPU sobre la que un hilo del proceso llamante esté actualmente ejecutable, forzando a cada uno a ejecutar una barrera de memoria completa — el truco de la barrera de memoria asimétrica que permite a los algoritmos lock-free del hilo llamante saltarse un `mfence` explícito en la ruta *rápida* y pagar el coste total solo en la rara ruta *lenta*. .NET, Java HotSpot vía sus wrappers nativos y las colas lock-free de alto rendimiento (Boost.Lockfree, concurrentqueue) lo usan todos. El coste es alto — decenas de microsegundos — pero amortizado entre muchas lecturas de ruta rápida.

Uso común por malware

Honestamente, este syscall tiene casi cero señal ofensiva. No asigna, lee, escribe ni toca de otra forma el estado del proceso de modo útil para un atacante. El único abuso teórico es el **canal lateral de timing CPU-bound**: el coste de la IPI es proporcional al número de CPUs ejecutando actualmente hilos del proceso llamante, lo que puede filtrar información gruesa de planificación sobre otros núcleos — pero es académico y no visto en malware real. Un puñado de chequeos anti-debugger oscuros han usado FlushProcessWriteBuffers para detectar single-stepping (el timing IPI cambia bajo debugger hardware), pero es una técnica marginal. No malgaste tiempo de caza en este.

Oportunidades de detección

No es un objetivo útil de detección. El uso legítimo es generalizado (cualquier proceso con runtime .NET, JVM o biblioteca lock-free moderna lo llamará). Los proveedores ETW no exponen este syscall, y no hay callback de kernel que valga la pena hookear. Si se encuentra escribiendo una regla de detección en torno a NtFlushProcessWriteBuffers, probablemente ha ido demasiado lejos — re-priorice.

Ejemplos de syscalls directos

cAsymmetric barrier for a lock-free reader

// Fast path: a regular load, no fence.
// Slow path (writer): publish, then NtFlushProcessWriteBuffers to fence every
// reader CPU at once.
#include <windows.h>

static volatile LONG g_seq;

void writer_publish(void) {
    InterlockedIncrement(&g_seq);
    FlushProcessWriteBuffers();   // ntdll!NtFlushProcessWriteBuffers
}

LONG reader_fast(void) {
    return g_seq;   // no mfence — the writer's IPI guarantees ordering.
}

asmx64 direct stub (Win11 24H2, SSN 0xF3)

NtFlushProcessWriteBuffers PROC
    mov  r10, rcx
    mov  eax, 0F3h
    syscall
    ret
NtFlushProcessWriteBuffers ENDP

Mapeos MITRE ATT&CK

Last verified: 2026-05-20