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 в точку входа ядра KiSystemStartup3.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`.
▶OslMainwinload.efi__fastcallEXPORTED
Развернуть псевдокод
Валидация блока параметров Boot Manager, инициализация BootLib и передача управления в OslpMain
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.
▶OslpLoadAllModuleswinload.efi__fastcallINTERNAL
Развернуть псевдокод
Последовательная загрузка и валидация цифровых подписей ntoskrnl.exe, hal.dll, kdcom.dll и mcupdate
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.
▶OslInitializeLoaderBlockwinload.efi__fastcallINTERNAL
Развернуть псевдокод
Связывание списков памяти, драйверов, куста SYSTEM и расширений гипервизора в единый блок параметров
4. Переход в ядро: OslExecuteTransition и OslArchTransferToKernel
OslExecuteTransitionwinload.efi
IRQL: UEFI ContextInternal
NTSTATUS __fastcall OslExecuteTransition(VOID) Выполняет фазу 1 настройки памяти `OslFwpKernelSetupPhase1` (построение страничных таблиц CR3 / PML4), останавливает отладочные протоколы `BlBdStop()`, фиксирует отметку времени RDTSC и вызывает ассемблерную подпрограмму `OslArchTransferToKernel`.
▶OslExecuteTransitionwinload.efi__fastcallINTERNAL
Развернуть псевдокод
Финальная подготовка контекста ядра, остановка сервисов BootLib и прыжок в KiSystemStartup
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`.
▶OslArchTransferToKernelwinload.efi__cdecl / asmINTERNAL
Развернуть псевдокод
Ассемблерная инициализация управляющих регистров процессора (GDTR, IDTR, CR0, CR4, MSR) и прыжок через retfq