> Windows Syscalls
ntoskrnl.exeT1559T1071T1106

NtCreateMailslotFile

Crée le côté serveur d'un mailslot — un primitif IPC historique à sens unique, façon datagramme, accessible via \Device\Mailslot.

Prototype

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

Arguments

NameTypeDirDescription
FileHandlePHANDLEoutReçoit le handle vers l'endpoint serveur mailslot nouvellement créé.
DesiredAccessACCESS_MASKinDroits d'accès demandés — typiquement GENERIC_READ | SYNCHRONIZE pour un serveur.
ObjectAttributesPOBJECT_ATTRIBUTESinNomme le mailslot, typiquement \??\mailslot\<nom> (correspond à \\.\mailslot\<nom>).
IoStatusBlockPIO_STATUS_BLOCKoutReçoit FILE_CREATED en cas de succès et le statut de complétion E/S.
CreateOptionsULONGinDrapeaux de création réservés — presque toujours 0 pour les mailslots.
MailslotQuotaULONGinOctets maximum pouvant être en file dans le slot. 0 = défaut système.
MaximumMessageSizeULONGinPlus grand message qu'une écriture unique peut porter. 0 = toute taille jusqu'à MailslotQuota.
ReadTimeoutPLARGE_INTEGERinDélai d'attente par défaut pour les lectures bloquantes. NULL = attendre indéfiniment, 0 = retour immédiat.

IDs de syscalls par version de Windows

Version 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

Module noyau

ntoskrnl.exeNtCreateMailslotFile

APIs liées

CreateMailslotWGetMailslotInfoSetMailslotInfoNtCreateNamedPipeFileNtCreateFile

Stub du 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

Notes non documentées

Les mailslots sont une IPC sans connexion, à sens unique — le *serveur* crée le slot via NtCreateMailslotFile et lit les datagrammes entrants ; les *clients* ouvrent simplement `\\<hôte>\mailslot\<nom>` avec NtOpenFile/NtCreateFile et y écrivent. Ils précèdent les pipes nommés et sont implémentés par mailslot.sys / mrxsmb.sys (la livraison cross-host emprunte SMB). Les messages peuvent être diffusés vers un nom à l'échelle du domaine (`\\*\mailslot\foo`), bien que ce chemin soit fortement restreint sur les domaines modernes. Taille maximale cross-réseau : 424 octets ; les mailslots purement locaux peuvent être bien plus grands.

Usage courant par les malwares

Les mailslots sont une IPC *favorable à l'OPSEC* car presque aucune stack de sécurité moderne ne les inspecte. Cobalt Strike a historiquement proposé un transport SMB mailslot pour la livraison beacon-à-beacon — fidélité plus faible que les pipes nommés mais largement invisible aux EDR qui hookent NtCreateNamedPipeFile / les name-callbacks FltMgr pour les pipes. Usage réel niche aujourd'hui : IPC locale discrète entre implants coopérants dans une même chaîne de mouvement latéral, là où les pipes nommés déclencheraient immédiatement Sysmon Event 17/18. L'utilisation par familles malware modernes nommées publiquement reste rare ; le différentiel asymétrique de détection est l'attrait principal.

Opportunités de détection

La détection est vraiment clairsemée. Sysmon n'a pas de MailslotEvent (les Events 17 / 18 ne couvrent que les pipes nommés). ETW Microsoft-Windows-Kernel-File émet des Create avec un chemin `\Device\Mailslot\` — écrire des règles sur ce préfixe dans les hooks file-create EDR. CmRegisterCallbackEx ne s'applique pas (pas de registre impliqué) ; le bon point de hook est FltRegisterFilter contre la chaîne minifilter file system de mailslot.sys. Requête de hunt : tout processus créant un objet sous `\Device\Mailslot\` en dehors de `lsass.exe` (NETLOGON), `services.exe` ou `winlogon.exe` mérite enquête.

Exemples de syscalls directs

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.

Mappings MITRE ATT&CK

Last verified: 2026-05-20