> Windows Syscalls
ntoskrnl.exeT1499T1106

NtCreatePagingFile

Crée ou étend un fichier d'échange Windows au chemin NT demandé ; requiert SeCreatePagefilePrivilege.

Prototype

NTSTATUS NtCreatePagingFile(
  PUNICODE_STRING PageFileName,
  PLARGE_INTEGER  MinimumSize,
  PLARGE_INTEGER  MaximumSize,
  ULONG           Priority
);

Arguments

NameTypeDirDescription
PageFileNamePUNICODE_STRINGinChemin namespace NT du pagefile, ex. \??\C:\pagefile.sys.
MinimumSizePLARGE_INTEGERinTaille initiale en octets ; doit être un multiple d'1 Mo et >= 16 Mo.
MaximumSizePLARGE_INTEGERinTaille maximale en octets ; doit être >= MinimumSize et un multiple d'1 Mo.
PriorityULONGinRéservé ; passer 0 sur Windows actuel.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070xA9win10-1507
Win10 16070xABwin10-1607
Win10 17030xAEwin10-1703
Win10 17090xAFwin10-1709
Win10 18030xB0win10-1803
Win10 18090xB0win10-1809
Win10 19030xB1win10-1903
Win10 19090xB1win10-1909
Win10 20040xB5win10-2004
Win10 20H20xB5win10-20h2
Win10 21H10xB5win10-21h1
Win10 21H20xB6win10-21h2
Win10 22H20xB6win10-22h2
Win11 21H20xB9win11-21h2
Win11 22H20xBAwin11-22h2
Win11 23H20xBAwin11-23h2
Win11 24H20xBCwin11-24h2
Server 20160xABwinserver-2016
Server 20190xB0winserver-2019
Server 20220xB8winserver-2022
Server 20250xBCwinserver-2025

Module noyau

ntoskrnl.exeNtCreatePagingFile

APIs liées

CreatePageFileWWin32_PageFileSetting (WMI)NtSetSystemInformation (SystemPageFileInformation)RemovePageFileW

Stub du syscall

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

La routine noyau derrière `kernel32!CreatePageFile` et la plomberie `pagefileconfig.vbs` / `wmic pagefileset`. Crée ou étend un pagefile de support et l'enregistre auprès de `MiPageFileInformation`. La vérification de privilège est sans ambiguïté : `SeCreatePagefilePrivilege` doit être activé dans le token de l'appelant, qui par défaut n'est accordé qu'à BUILTIN\Administrators et ne prend effet que sur les tokens non soumis au filtrage UAC (donc un shell admin non élevé ne réussira *pas*). Le noyau écrit le pagefile en sparse-étendu sur NTFS, donc la création se termine rapidement mais la consommation disque réelle croît à la demande. Passer une `MaximumSize` plus grande que l'espace disque libre réussit à l'enregistrement mais les extensions ultérieures échouent avec `STATUS_DISK_FULL`. Sur Windows moderne le pagefile est géré automatiquement ; la création manuelle est surtout utilisée par les spécialistes performance configurant des volumes de dump dédiés.

Usage courant par les malwares

Surface niche de DoS / épuisement de ressources privilégié. Trois patterns observés. Premièrement, **épuisement disque** : enregistrer un pagefile avec une énorme `MaximumSize` sur le disque système — quand la pression mémoire subséquente force des extensions, le noyau dévore avec plaisir tous les secteurs restants jusqu'à ce que les services commencent à échouer. Deuxièmement, **détournement de volume de dump** : rediriger le pagefile de crash-dump vers un emplacement contrôlé pour capturer le prochain dump mémoire BSOD (qui peut contenir des clés de déchiffrement, identifiants en clair, etc.). Troisièmement, **bruit forensique** : créer un nouveau pagefile sur un volume non-système force le memory manager SMM/EFI à l'honorer, fragmentant tout carving d'image disque ultérieur. Aucun de ces patterns n'est un standard du malware commodity — ils nécessitent `SeCreatePagefilePrivilege`, et un attaquant ayant déjà ce niveau d'admin peut faire bien des choses moins bruyantes. Les observations terrain sont rares et tendent au red-team plus qu'au crimeware.

Opportunités de détection

Auditer l'usage de `SeCreatePagefilePrivilege` via Security Event ID 4673 (la sous-catégorie `Sensitive Privilege Use` doit être activée — elle est désactivée par défaut). Les nouveaux enregistrements de pagefile émergent aussi comme évènement ETW `Microsoft-Windows-Kernel-Memory` ID 3 (`PagefileCreated`) avec le chemin NT complet. Tout chemin de pagefile hors `\??\<drive>:\pagefile.sys` et `\??\<drive>:\swapfile.sys` (fichier swap UWP modern-standby) est inhabituel. Sysmon Event 11 (`FileCreate`) se déclenchera si la destination est sur un volume surveillé. Les défenseurs peuvent aussi baseliner le nombre et la taille totale de pagefile attendus via WMI (`Win32_PageFileSetting`) et alerter sur dérive.

Exemples de syscalls directs

cEnable SeCreatePagefilePrivilege then register a 1 GB pagefile

#include <windows.h>
#include <winternl.h>

typedef NTSTATUS (NTAPI* pNtCreatePagingFile)(
    PUNICODE_STRING, PLARGE_INTEGER, PLARGE_INTEGER, ULONG);

static BOOL enable_priv(LPCSTR name) {
    HANDLE tok; TOKEN_PRIVILEGES tp;
    OpenProcessToken(GetCurrentProcess(),
                     TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tok);
    LookupPrivilegeValueA(NULL, name, &tp.Privileges[0].Luid);
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(tok, FALSE, &tp, 0, NULL, NULL);
    BOOL ok = GetLastError() == ERROR_SUCCESS;
    CloseHandle(tok);
    return ok;
}

void add_pagefile(void) {
    enable_priv("SeCreatePagefilePrivilege");

    UNICODE_STRING path;
    RtlInitUnicodeString(&path, L"\\??\\C:\\extra_pagefile.sys");
    LARGE_INTEGER minSize = { .QuadPart = 1024LL * 1024 * 1024 };  // 1 GB
    LARGE_INTEGER maxSize = { .QuadPart = 2048LL * 1024 * 1024 };  // 2 GB

    pNtCreatePagingFile f = (pNtCreatePagingFile)GetProcAddress(
        GetModuleHandleA("ntdll.dll"), "NtCreatePagingFile");
    f(&path, &minSize, &maxSize, 0);
}

asmx64 direct stub (Win11 24H2 / Server 2025, SSN 0xBC)

NtCreatePagingFile PROC
    mov  r10, rcx
    mov  eax, 0BCh
    syscall
    ret
NtCreatePagingFile ENDP

Mappings MITRE ATT&CK

Last verified: 2026-05-20