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
| Name | Type | Dir | Description |
|---|---|---|---|
| PageFileName | PUNICODE_STRING | in | Chemin namespace NT du pagefile, ex. \??\C:\pagefile.sys. |
| MinimumSize | PLARGE_INTEGER | in | Taille initiale en octets ; doit être un multiple d'1 Mo et >= 16 Mo. |
| MaximumSize | PLARGE_INTEGER | in | Taille maximale en octets ; doit être >= MinimumSize et un multiple d'1 Mo. |
| Priority | ULONG | in | Réservé ; passer 0 sur Windows actuel. |
IDs de syscalls par version de Windows
| Version de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0xA9 | win10-1507 |
| Win10 1607 | 0xAB | win10-1607 |
| Win10 1703 | 0xAE | win10-1703 |
| Win10 1709 | 0xAF | win10-1709 |
| Win10 1803 | 0xB0 | win10-1803 |
| Win10 1809 | 0xB0 | win10-1809 |
| Win10 1903 | 0xB1 | win10-1903 |
| Win10 1909 | 0xB1 | win10-1909 |
| Win10 2004 | 0xB5 | win10-2004 |
| Win10 20H2 | 0xB5 | win10-20h2 |
| Win10 21H1 | 0xB5 | win10-21h1 |
| Win10 21H2 | 0xB6 | win10-21h2 |
| Win10 22H2 | 0xB6 | win10-22h2 |
| Win11 21H2 | 0xB9 | win11-21h2 |
| Win11 22H2 | 0xBA | win11-22h2 |
| Win11 23H2 | 0xBA | win11-23h2 |
| Win11 24H2 | 0xBC | win11-24h2 |
| Server 2016 | 0xAB | winserver-2016 |
| Server 2019 | 0xB0 | winserver-2019 |
| Server 2022 | 0xB8 | winserver-2022 |
| Server 2025 | 0xBC | winserver-2025 |
Module noyau
APIs liées
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 ENDPMappings MITRE ATT&CK
Last verified: 2026-05-20