> Windows Syscalls
ntoskrnl.exeT1559T1071T1106

NtCreateMailslotFile

Erstellt die Server-Seite eines Mailslots — einer altertümlichen, einseitigen, datagramm-artigen IPC-Primitive, erreichbar über \Device\Mailslot.

Prototyp

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

Argumente

NameTypeDirDescription
FileHandlePHANDLEoutEmpfängt das Handle auf den neu erstellten Mailslot-Server-Endpunkt.
DesiredAccessACCESS_MASKinAngeforderte Zugriffsrechte — typischerweise GENERIC_READ | SYNCHRONIZE für einen Server.
ObjectAttributesPOBJECT_ATTRIBUTESinBenennt den Mailslot, typischerweise \??\mailslot\<Name> (entspricht \\.\mailslot\<Name>).
IoStatusBlockPIO_STATUS_BLOCKoutEmpfängt FILE_CREATED bei Erfolg und den I/O-Completion-Status.
CreateOptionsULONGinReservierte Erstellungs-Flags — bei Mailslots fast immer 0.
MailslotQuotaULONGinMaximale Bytes, die gleichzeitig im Slot anstehen können. 0 = System-Default.
MaximumMessageSizeULONGinGrößte Nachricht, die ein einzelner Write tragen darf. 0 = beliebige Größe bis MailslotQuota.
ReadTimeoutPLARGE_INTEGERinStandard-Timeout für blockierende Reads. NULL = ewig warten, 0 = sofort zurück.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
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

Kernel-Modul

ntoskrnl.exeNtCreateMailslotFile

Verwandte APIs

CreateMailslotWGetMailslotInfoSetMailslotInfoNtCreateNamedPipeFileNtCreateFile

Syscall-Stub

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

Undokumentierte Hinweise

Mailslots sind eine verbindungslose, einseitige IPC — der *Server* erstellt den Slot via NtCreateMailslotFile und liest eingehende Datagramme; *Clients* öffnen einfach `\\<Host>\mailslot\<Name>` mit NtOpenFile/NtCreateFile und schreiben darauf. Sie sind älter als Named Pipes und werden von mailslot.sys / mrxsmb.sys implementiert (Cross-Host-Zustellung läuft über SMB). Nachrichten lassen sich an einen domänenweiten Namen broadcasten (`\\*\mailslot\foo`), allerdings ist dieser Pfad in modernen Domains stark eingeschränkt. Maximale Cross-Network-Nachrichtengröße: 424 Bytes; rein lokale Mailslots können viel größer sein.

Häufige Malware-Nutzung

Mailslots sind eine *OPSEC-vorteilhafte* IPC, weil kaum eine moderne Security-Stack sie inspiziert. Cobalt Strike bot historisch einen Mailslot-SMB-Transport für Beacon-zu-Beacon-Zustellung — geringere Fidelität als Named Pipes, aber für EDRs, die NtCreateNamedPipeFile / FltMgr-Name-Callbacks für Pipes hooken, weitgehend unsichtbar. Heutige Nischennutzung: verdeckte lokale IPC zwischen kooperierenden Implants in einer Lateral-Movement-Kette, wo Named Pipes sofort Sysmon Event 17/18 ziehen würden. Echte Nennung in modernen Malware-Familien ist selten; der asymmetrische Detection-Gap ist der Hauptreiz.

Erkennungs­möglichkeiten

Detection ist tatsächlich dünn. Sysmon hat kein MailslotEvent (Event 17 / 18 decken nur Named Pipes ab). ETW Microsoft-Windows-Kernel-File liefert Create-Events mit `\Device\Mailslot\`-Pfad — Regeln gegen dieses Präfix in EDR-File-Create-Hooks schreiben. CmRegisterCallbackEx greift nicht (keine Registry); der richtige Hookpunkt ist FltRegisterFilter gegen die mailslot.sys-Minifilter-Kette des Dateisystems. Hunt-Query: jeder Prozess, der ein Objekt unter `\Device\Mailslot\` außerhalb von `lsass.exe` (NETLOGON), `services.exe` oder `winlogon.exe` erstellt, ist untersuchungswürdig.

Direkte Syscall-Beispiele

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.

MITRE ATT&CK-Mappings

Last verified: 2026-05-20