Skip to content

3. Windows OS Loader (winload.efi) ​

Загрузчик операционной системы (winload.efi) подготавливает низкоуровневую среду для старта ядра. Он загружает ядро ntoskrnl.exe, слой HAL, ELAM-драйверы, строит таблицы страниц виртуальной памяти (CR3 / PTE), формирует структуру LOADER_PARAMETER_BLOCK и выполняет вызов ExitBootServices, отключая сервисы прошивки UEFI.


3.1 Архитектурный pipeline winload.efi ​

[ OslMain ] (0x180001090)
    │
    ├── Валидация сигнатуры "BTAPENT" в BOOT_APPLICATION_PARAMETER_BLOCK
    ├── Настройка шрифтов \Windows\Boot\Fonts и параметров BlInitializeLibrary
    └── Вызов OslpMain
         │
         ▼
[ OslPrepareTarget ] (0x180007BFC)
    ├── Инициализация групп расширений OslCoreExtensionSubGroups
    ├── Загрузка модулей ядра: OslpLoadAllModules (ntoskrnl.exe, hal.dll, kdcom.dll, mcupdate)
    ├── Загрузка системного куста реестра: OslpLoadSystemHive (\System32\config\SYSTEM)
    └── Поиск и загрузка загрузочных драйверов: OslGetBootDrivers / OslLoadDrivers / ELAM
         │
         ▼
[ OslInitializeLoaderBlock ] (0x180011CCC)
    ├── Инициализация списков LOADER_PARAMETER_BLOCK (LoadOrderListHead, MemoryDescriptorListHead)
    ├── Настройка NLS-таблиц, опций командной строки ядра (LoadOptions) и расширений VBS/HVCI
    └── Построение физической и виртуальной карты памяти OslBuildKernelMemoryMap
         │
         ▼
[ OslExecuteTransition ] (0x180016584)
    ├── Подготовка страничных таблиц фазы 1 OslFwpKernelSetupPhase1 (CR3 / PML4, вызов UEFI ExitBootServices)
    ├── Остановка протокола отладки BlBdStop() и сохранение меток производительности RDTSC
    └── Вызов низкоуровневого переключателя OslArchTransferToKernel
         │
         ▼
[ OslArchTransferToKernel ] (0x180167E80)
    ├── Сброс процессорных кэшей wbinvd
    ├── Загрузка дескрипторных таблиц ядра: lgdt (&OslArchKernelGdt) и lidt (&OslArchKernelIdt)
    ├── Настройка управляющих регистров: CR4 |= 0x680 (PGE, OSFXSR, OSXMMEXCPT), CR0 |= 0x50020 (NE, WP, AM), сброс CR8 = 0
    ├── Нормализация регистров расширений в MSR 0xC0000080 (IA32_EFER |= LME | NXE | SCE)
    ├── Загрузка селектора сегмента задачи TSS: ltr ax
    └── Вызов инструкции дальнего возврата retfq в точку входа ядра KiSystemStartup

3.2 Декомпилированный C-код функций winload.efi ​

Целевая сборка: Windows 10 22H2 x64 (Build 10.0.19045.2965). Имена внутренних функций и RVA-адреса зависят от версии сборки.
Конвенция вызовов (x64 ABI): Аннотации конвенций вызовов (__fastcall, __stdcall) воспроизводят декораторы типов декомпилятора Hex-Rays / IDA Pro. В архитектуре Windows x64 действует единый системный Microsoft x64 ABI (передача параметров через RCX, RDX, R8, R9, выделение Shadow Space).


1. Главная точка входа: OslMain ​

OslMainwinload.efi
IRQL: UEFI ContextInternal
NTSTATUS __fastcall OslMain(PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters)
Главная точка входа загрузчика `winload.efi`. Валидирует сигнатуру `BTAPENT`, инициализирует базовые подсистемы BootLib с путями к системным шрифтам `\Windows\Boot\Fonts`, выделяет память для кучи и передает управление в `OslpMain` / `OslPrepareTarget`.

2. Загрузка модулей ядра: OslpLoadAllModules ​

OslpLoadAllModuleswinload.efi
IRQL: UEFI ContextInternal
NTSTATUS __fastcall OslpLoadAllModules(POSL_LOADER_BLOCK LoaderBlock, PBOOT_ENVIRONMENT_DEVICE SystemDevice)
Загружает в физическую память исполняемые PE-образы ядра ntoskrnl.exe, аппаратно-зависимого слоя hal.dll, библиотеки отладки `kdcom.dll` / `kdnet.dll`, модуля микрокода ЦП `mcupdate_*.dll` и шрифтов интерфейса BGFX.

3. Инициализация блока параметров: OslInitializeLoaderBlock ​

OslInitializeLoaderBlockwinload.efi
IRQL: UEFI ContextInternal
NTSTATUS __fastcall OslInitializeLoaderBlock(ULONG Flags, HANDLE SystemHiveHandle, PLOADER_PARAMETER_BLOCK LoaderBlock)
Инициализирует главную структуру `LOADER_PARAMETER_BLOCK`, настраивает списки загруженных модулей, дескрипторы карты физической памяти, параметры реестра и структуру расширений `_LOADER_PARAMETER_EXTENSION` для VBS / HVCI.

4. Переход в ядро: OslExecuteTransition и OslArchTransferToKernel ​

OslExecuteTransitionwinload.efi
IRQL: UEFI ContextInternal
NTSTATUS __fastcall OslExecuteTransition(VOID)
Выполняет фазу 1 настройки памяти `OslFwpKernelSetupPhase1` (построение страничных таблиц CR3 / PML4), останавливает отладочные протоколы `BlBdStop()`, фиксирует отметку времени RDTSC и вызывает ассемблерную подпрограмму `OslArchTransferToKernel`.
OslArchTransferToKernelwinload.efi
IRQL: CR8=0 (TPR=0)Internal
VOID OslArchTransferToKernel(PLOADER_PARAMETER_BLOCK LoaderBlock, PVOID KernelEntryPoint)
Низкоуровневая ассемблерная точка переключения контекста: сбрасывает кэши процессора через `wbinvd`, загружает регистры GDTR и IDTR, настраивает регистры CR0, CR4, нормализует расширения IA32_EFER MSR, сбрасывает регистр приоритета прерываний `CR8` в 0, загружает селектор задачи `ltr` и выполняет инструкцию `retfq`, передавая управление функции ядра `KiSystemStartup`.

Interactive documentation of Windows NT (Build 10.0.19045.2965 x64) • Source Code