> Windows Syscalls
ntoskrnl.exeT1559T1071T1106

NtCreateMailslotFile

Crea el lado servidor de un mailslot — una primitiva IPC histórica unidireccional tipo datagrama, accesible vía \Device\Mailslot.

Prototipo

NTSTATUS NtCreateMailslotFile(
  PHANDLE            FileHandle,
  ACCESS_MASK        DesiredAccess,
  POBJECT_ATTRIBUTES ObjectAttributes,
  PIO_STATUS_BLOCK   IoStatusBlock,
  ULONG              CreateOptions,
  ULONG              MailslotQuota,
  ULONG              MaximumMessageSize,
  PLARGE_INTEGER     ReadTimeout
);

Argumentos

NameTypeDirDescription
FileHandlePHANDLEoutRecibe el handle al endpoint servidor del mailslot recién creado.
DesiredAccessACCESS_MASKinDerechos de acceso solicitados — típicamente GENERIC_READ | SYNCHRONIZE para un servidor.
ObjectAttributesPOBJECT_ATTRIBUTESinNombra el mailslot, típicamente \??\mailslot\<nombre> (corresponde a \\.\mailslot\<nombre>).
IoStatusBlockPIO_STATUS_BLOCKoutRecibe FILE_CREATED en éxito y el estado de completación de E/S.
CreateOptionsULONGinBanderas de creación reservadas — casi siempre 0 para mailslots.
MailslotQuotaULONGinMáximo de bytes en cola en el slot a la vez. 0 = predeterminado del sistema.
MaximumMessageSizeULONGinTamaño máximo de un único mensaje. 0 = cualquier tamaño hasta MailslotQuota.
ReadTimeoutPLARGE_INTEGERinTiempo de espera por defecto para lecturas bloqueantes. NULL = esperar para siempre, 0 = retorno inmediato.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070xA6win10-1507
Win10 16070xA8win10-1607
Win10 17030xABwin10-1703
Win10 17090xACwin10-1709
Win10 18030xADwin10-1803
Win10 18090xADwin10-1809
Win10 19030xAEwin10-1903
Win10 19090xAEwin10-1909
Win10 20040xB2win10-2004
Win10 20H20xB2win10-20h2
Win10 21H10xB2win10-21h1
Win10 21H20xB3win10-21h2
Win10 22H20xB3win10-22h2
Win11 21H20xB6win11-21h2
Win11 22H20xB7win11-22h2
Win11 23H20xB7win11-23h2
Win11 24H20xB9win11-24h2
Server 20160xA8winserver-2016
Server 20190xADwinserver-2019
Server 20220xB5winserver-2022
Server 20250xB9winserver-2025

Módulo del kernel

ntoskrnl.exeNtCreateMailslotFile

APIs relacionadas

CreateMailslotWGetMailslotInfoSetMailslotInfoNtCreateNamedPipeFileNtCreateFile

Stub del syscall

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

Los mailslots son una IPC sin conexión y unidireccional — el *servidor* crea el slot vía NtCreateMailslotFile y lee los datagramas entrantes; los *clientes* simplemente abren `\\<host>\mailslot\<nombre>` con NtOpenFile/NtCreateFile y escriben en él. Anteceden a las named pipes y los implementan mailslot.sys / mrxsmb.sys (la entrega entre hosts viaja por SMB). Los mensajes pueden difundirse a un nombre a nivel de dominio (`\\*\mailslot\foo`), aunque esa ruta está muy restringida en los dominios modernos. Tamaño máximo cross-red: 424 bytes; los mailslots puramente locales pueden ser mucho mayores.

Uso común por malware

Los mailslots son una IPC *OPSEC-favorable* porque casi ninguna stack de seguridad moderna los inspecciona. Cobalt Strike ofreció históricamente un transporte SMB mailslot para entrega beacon-a-beacon — fidelidad menor que las named pipes pero en gran parte invisible para los EDR que hookean NtCreateNamedPipeFile / los name-callbacks de FltMgr para pipes. Uso real nicho hoy: IPC local encubierta entre implantes cooperantes en la misma cadena de movimiento lateral, donde las named pipes atraerían atención inmediata de Sysmon Event 17/18. El uso por familias de malware modernas nombradas públicamente es raro; la asimetría de detección es el atractivo principal.

Oportunidades de detección

La detección es genuinamente escasa. Sysmon no tiene MailslotEvent (Events 17 / 18 cubren sólo named pipes). ETW Microsoft-Windows-Kernel-File emite Create con una ruta `\Device\Mailslot\` — escribir reglas contra ese prefijo en los hooks file-create del EDR. CmRegisterCallbackEx no se aplica (no hay registro); el punto de hook correcto es FltRegisterFilter contra la cadena minifilter del file system de mailslot.sys. Consulta de hunt: cualquier proceso creando un objeto bajo `\Device\Mailslot\` fuera de `lsass.exe` (NETLOGON), `services.exe` o `winlogon.exe` merece investigarse.

Ejemplos de syscalls directos

cMinimal mailslot server

// Creates \\.\mailslot\implant_chan as a passive receiver.
UNICODE_STRING name;
RtlInitUnicodeString(&name, L"\\??\\mailslot\\implant_chan");

OBJECT_ATTRIBUTES oa;
InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);

IO_STATUS_BLOCK iosb;
HANDLE hSlot = NULL;

NTSTATUS st = NtCreateMailslotFile(
    &hSlot,
    GENERIC_READ | SYNCHRONIZE,
    &oa,
    &iosb,
    0,        // CreateOptions
    0,        // MailslotQuota — system default
    1024,     // MaximumMessageSize
    NULL      // ReadTimeout — wait forever
);

asmx64 direct stub (Win11 24H2 SSN 0xB9)

NtCreateMailslotFile PROC
    mov  r10, rcx
    mov  eax, 0B9h
    syscall
    ret
NtCreateMailslotFile ENDP

rustwindows-sys receiver

// Cargo: windows-sys = "0.59" (Win32_Storage_FileSystem, Win32_Foundation)
use windows_sys::Win32::Storage::FileSystem::*;
let h = unsafe {
    CreateMailslotW(
        w!("\\\\.\\mailslot\\implant_chan"),
        1024,                       // nMaxMessageSize
        MAILSLOT_WAIT_FOREVER,      // lReadTimeout
        null_mut(),                 // lpSecurityAttributes
    )
};
// CreateMailslotW funnels into NtCreateMailslotFile.

Mapeos MITRE ATT&CK

Last verified: 2026-05-20