NtQueryInformationByName
Interroge des informations de fichier par chemin sans handle ouvert, introduit dans Windows 10 RS5.
Prototype
NTSTATUS NtQueryInformationByName( POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass );
Arguments
| Name | Type | Dir | Description |
|---|---|---|---|
| ObjectAttributes | POBJECT_ATTRIBUTES | in | Attributs d'objet décrivant le chemin du fichier cible. ObjectName est le chemin NT. |
| IoStatusBlock | PIO_STATUS_BLOCK | out | Reçoit le statut final et le nombre d'octets écrits dans FileInformation. |
| FileInformation | PVOID | out | Tampon de l'appelant qui reçoit la classe d'information demandée. |
| Length | ULONG | in | Taille de FileInformation en octets. |
| FileInformationClass | FILE_INFORMATION_CLASS | in | Classe identifiant l'information à retourner (ex. FileStatInformation, FileStatBasicInformation). |
IDs de syscalls par version de Windows
| Version de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1703 | 0x13B | win10-1703 |
| Win10 1709 | 0x13E | win10-1709 |
| Win10 1803 | 0x140 | win10-1803 |
| Win10 1809 | 0x141 | win10-1809 |
| Win10 1903 | 0x142 | win10-1903 |
| Win10 1909 | 0x142 | win10-1909 |
| Win10 2004 | 0x148 | win10-2004 |
| Win10 20H2 | 0x148 | win10-20h2 |
| Win10 21H1 | 0x148 | win10-21h1 |
| Win10 21H2 | 0x149 | win10-21h2 |
| Win10 22H2 | 0x149 | win10-22h2 |
| Win11 21H2 | 0x14F | win11-21h2 |
| Win11 22H2 | 0x151 | win11-22h2 |
| Win11 23H2 | 0x151 | win11-23h2 |
| Win11 24H2 | 0x153 | win11-24h2 |
| Server 2019 | 0x141 | winserver-2019 |
| Server 2022 | 0x14E | winserver-2022 |
| Server 2025 | 0x153 | winserver-2025 |
Module noyau
APIs liées
Stub du syscall
4C 8B D1 mov r10, rcx B8 53 01 00 00 mov eax, 0x153 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
Introduit dans Windows 10 1709 (usage officiellement documenté à partir de RS5/1803), NtQueryInformationByName fusionne le triplet historique `NtCreateFile → NtQueryInformationFile → NtClose` en un seul syscall quand l'appelant n'a besoin que des métadonnées. En interne le noyau doit toujours traverser la pile filesystem du répertoire parent et acquérir un FILE_OBJECT transitoire, mais n'installe jamais de handle dans la table de handles de l'appelant — d'où moins d'événements bruyants Sysmon Event ID 11/15 et zéro turn-over de table de handles. Seules quelques valeurs `FILE_INFORMATION_CLASS` sont acceptées (FileStatInformation, FileStatBasicInformation, FileStatLxInformation, FileCaseSensitiveInformation, FileStorageReserveIdInformation).
Usage courant par les malwares
Utilisé par les scanners, les loaders à environment-keying et les droppers de payload étagés sensibles aux EDR pour tester l'existence de fichiers marqueurs (ex. preuve d'un build spécifique d'un EDR sur disque, ou un fichier d'empreinte victime) sans laisser de trace de télémétrie d'open-handle. Comme aucun handle n'est créé, les minifilters filesystem qui dépendent de `IRP_MJ_CREATE` voient l'ouverture comme transitoire et éphémère ; les hooks user-mode sur `NtCreateFile`/`NtOpenFile` sont entièrement contournés — le chemin syscall est directement `NtQueryInformationByName`. Le signal est plus faible que la reconnaissance basée sur NtCreateFile, ce qui est précisément le but. Certains scanners du commerce (profilers style CCleaner, mais aussi des infostealers récents) ont migré vers cette API pour réduire le bruit d'open-file.
Opportunités de détection
Les minifilters filesystem voient toujours l'IRP_MJ_CREATE transitoire — les événements File Sysmon configurés avec `IncludeTransientHandles=true` (option relativement récente) feront surgir ceux-ci. Les événements ETW Microsoft-Windows-Kernel-File `Create` sont émis avec un drapeau `TransitionTrace` distinguant la requête par nom d'une ouverture avec handle tenu. La chasse aux appels `NtQueryInformationByName` ciblant `*.exe`, `*.dll` ou des chemins d'installation EDR spécifiques depuis un processus non-système est un signal d'anomalie plus fort que le syscall lui-même. Sysmon Event ID 11 (FileCreate) et Event ID 15 (FileCreateStreamHash) ne se déclencheront *pas* — cette absence, couplée à un comportement conditionné par l'existence du fichier, est la détection.
Exemples de syscalls directs
cCheck for EDR install marker without opening a handle
// Probe for the presence of an EDR DLL on disk using the new RS5+ syscall.
#include <windows.h>
#include <winternl.h>
typedef struct _FILE_STAT_BASIC_INFORMATION {
LARGE_INTEGER FileId;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER AllocationSize;
LARGE_INTEGER EndOfFile;
ULONG FileAttributes;
ULONG ReparseTag;
ULONG NumberOfLinks;
ULONG DeviceType;
ULONG DeviceCharacteristics;
ULONG Reserved;
LARGE_INTEGER VolumeSerialNumber;
FILE_ID_128 FileId128;
} FILE_STAT_BASIC_INFORMATION;
typedef NTSTATUS (NTAPI *PNTQUERYINFORMATIONBYNAME)(
POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, PVOID, ULONG, ULONG);
BOOL FileExistsQuietly(LPCWSTR ntPath) {
UNICODE_STRING us;
RtlInitUnicodeString(&us, ntPath);
OBJECT_ATTRIBUTES oa;
InitializeObjectAttributes(&oa, &us, OBJ_CASE_INSENSITIVE, NULL, NULL);
FILE_STAT_BASIC_INFORMATION info;
IO_STATUS_BLOCK iosb;
PNTQUERYINFORMATIONBYNAME f = (PNTQUERYINFORMATIONBYNAME)GetProcAddress(
GetModuleHandleA("ntdll.dll"), "NtQueryInformationByName");
return f && f(&oa, &iosb, &info, sizeof(info), 75 /* FileStatBasicInformation */) == 0;
}asmx64 direct stub (Win11 24H2, SSN 0x153)
NtQueryInformationByName PROC
mov r10, rcx
mov eax, 153h
syscall
ret
NtQueryInformationByName ENDPMappings MITRE ATT&CK
Last verified: 2026-05-20