> Windows Syscalls
ntoskrnl.exeT1542.003T1082T1542

NtQueryBootEntryOrder

Lit la liste ordonnée d'IDs BOOT_ENTRY du firmware — la séquence que la plateforme tentera au prochain allumage.

Prototype

NTSTATUS NtQueryBootEntryOrder(
  PULONG Ids,
  PULONG Count
);

Arguments

NameTypeDirDescription
IdsPULONGoutTableau alloué par l'appelant qui reçoit les identifiants BOOT_ENTRY ordonnés. Peut être NULL pour interroger le Count requis.
CountPULONGin/outEn entrée : nombre de slots ULONG dans Ids. En sortie : nombre d'IDs écrits, ou compte requis lorsque STATUS_BUFFER_TOO_SMALL est retourné.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070x128win10-1507
Win10 16070x12Ewin10-1607
Win10 17030x133win10-1703
Win10 17090x135win10-1709
Win10 18030x137win10-1803
Win10 18090x138win10-1809
Win10 19030x139win10-1903
Win10 19090x139win10-1909
Win10 20040x13Fwin10-2004
Win10 20H20x13Fwin10-20h2
Win10 21H10x13Fwin10-21h1
Win10 21H20x140win10-21h2
Win10 22H20x140win10-22h2
Win11 21H20x146win11-21h2
Win11 22H20x148win11-22h2
Win11 23H20x148win11-23h2
Win11 24H20x14Awin11-24h2
Server 20160x12Ewinserver-2016
Server 20190x138winserver-2019
Server 20220x145winserver-2022
Server 20250x14Awinserver-2025

Module noyau

ntoskrnl.exeNtQueryBootEntryOrder

APIs liées

GetFirmwareEnvironmentVariableW (BootOrder)bcdedit.exe /enumBcdGetElementData (Boot Order GUID)NtSetBootEntryOrderNtEnumerateBootEntries

Stub du syscall

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

Sur UEFI, c'est fondamentalement un wrapper sur la variable NVRAM `BootOrder` définie par le firmware (EFI Global Variable, GUID `{8BE4DF61-93CA-11d2-AA0D-00E098032B8C}`). Le tableau est la *séquence* dans laquelle le firmware tentera chaque variable `Boot####`. Le premier appel utilise typiquement un buffer `Ids` NULL pour connaître la taille, le second collecte les données. SeSystemEnvironmentPrivilege est requis.

Usage courant par les malwares

Prérequis à NtSetBootEntryOrder : les installeurs de bootkit lisent l'ordre courant, insèrent leur ID fraîchement enregistré en position 0 (ou là où ils en ont besoin par rapport aux entrées existantes), puis le réécrivent. Ils utilisent aussi la requête pour vérifier que la persistance a survécu à un redémarrage — si `Ids[0]` n'est plus le GUID de l'attaquant, l'implant sait qu'un défenseur ou une mise à jour BIOS a restauré l'ordre et relance l'installation. Cette boucle est documentée dans le module de persistance de BlackLotus.

Opportunités de détection

Mêmes mises en garde que NtEnumerateBootEntries — lecture seule et fréquemment légitime. L'indicateur haute fidélité est la *paire* : query + set avec un delta qui promeut un loader non signé Microsoft en tête de l'ordre. Comparer le résultat de ce syscall à une baseline propre ; mieux encore, intégrer la variable EFI `BootOrder` à l'inventaire des actifs (Eclypsium, CHIPSEC, ou attestation santé Intune) et alerter sur les changements.

Exemples de syscalls directs

asmx64 direct stub (Win11 24H2, SSN 0x14A)

NtQueryBootEntryOrder PROC
    mov  r10, rcx          ; PULONG Ids
    mov  eax, 014Ah        ; Win11 24H2
    syscall
    ret
NtQueryBootEntryOrder ENDP

cRead current BootOrder

extern NTSTATUS NTAPI NtQueryBootEntryOrder(PULONG, PULONG);

void show_order(void) {
    ULONG count = 0;
    NtQueryBootEntryOrder(NULL, &count);          // STATUS_BUFFER_TOO_SMALL, fills count
    if (!count) return;
    PULONG ids = (PULONG)HeapAlloc(GetProcessHeap(), 0, count * sizeof(ULONG));
    if (NT_SUCCESS(NtQueryBootEntryOrder(ids, &count))) {
        for (ULONG i = 0; i < count; ++i) wprintf(L"%u -> id=%08X\n", i, ids[i]);
    }
    HeapFree(GetProcessHeap(), 0, ids);
}

rustNaked stub

use std::arch::asm;

#[unsafe(naked)]
unsafe extern "system" fn nt_query_boot_entry_order(_ids: *mut u32, _count: *mut u32) -> i32 {
    asm!(
        "mov r10, rcx",
        "mov eax, 0x14A",  // Win11 24H2
        "syscall",
        "ret",
        options(noreturn),
    );
}

Mappings MITRE ATT&CK

Last verified: 2026-05-20