Skip to content

1. Полное завершение работы (Shutdown S5 & Reboot) ​

Стек полного выключения Windows NT охватывает сквозной конвейер: от клика пользователя в меню «Пуск» оболочки explorer.exe через закрытие приложений сессии, выгрузку служб SCM, флашинг дисковых кэшей и кустов реестра до аппаратного обесточивания через ACPI / UEFI.


1.1 Полная схема вызовов ​

100%

1.2 Инициация в пользовательском режиме (explorer.exe) ​

Когда пользователь нажимает кнопку выключения:

  1. Оболочка explorer.exe вызывает API-функцию ExitWindowsEx(EWX_SHUTDOWN | EWX_POWEROFF, SHTDN_REASON_FLAG_PLANNED).
  2. Функция формирует LPC/ALPC-запрос к подсистеме csrss.exe и RPC-вызов диспетчеру winlogon.exe.

1.3 Завершение пользовательской сессии (winlogon.exe и csrss.exe) ​

  1. Опрос приложений (WM_QUERYENDSESSION): csrss.exe обходит список GUI-потоков в интерактивной сессии и отправляет сообщение WM_QUERYENDSESSION. Если приложение возвращает FALSE и не зависло, LogonUI.exe отображает экран предупреждения с предложением принудительно закрыть программы.
  2. Закрытие приложений (WM_ENDSESSION): При подтверждении приложения получают WM_ENDSESSION, сохраняют несохраненные данные и завершаются через ExitProcess(0).
  3. Принудительное завершение: По истечении таймаута WaitToKillAppTimeout оставшиеся неотвечающие процессы завершаются ядром через NtTerminateProcess.
  4. Выгрузка профиля пользователя: winlogon.exe вызывает UnloadUserProfile, фиксирует куст NTUSER.DAT в реестре, закрывает оконную станцию WinSta0 и переходит к завершению Session 0.

1.4 Остановка служб и Session 0 (wininit.exe и services.exe) ​

  1. wininit.exe вызывает WinInitNotifyShutdown, уведомляя диспетчер служб Service Control Manager (services.exe).
  2. Фаза Preshutdown (SERVICE_CONTROL_PRESHUTDOWN): Службы, зарегистрировавшие расширенный контроль (базы данных SQL Server, службы Hyper-V, антивирусы), получают уведомление SERVICE_CONTROL_PRESHUTDOWN. Диспетчер ожидает их завершения в порядке, заданном параметром реестра PreshutdownOrder, выделяя до нескольких минут (PreshutdownTimeout).
  3. Фаза Shutdown (SERVICE_CONTROL_SHUTDOWN): Всем остальным активным службам параллельно отправляется SERVICE_CONTROL_SHUTDOWN.
  4. Остановка подсистемы безопасности: wininit.exe инициирует закрытие подсистемы lsass.exe: LsaShutdown (выгрузка пакетов аутентификации Kerberos и NTLM) и вызывает системный вызов NtShutdownSystem(ShutdownPowerOff).

1.5 Ядро и файловые системы (ntoskrnl.exe) ​

1. Главный координатор выключения ядра: PopGracefulShutdown ​

PopGracefulShutdownntoskrnl.exe
IRQL: PASSIVE_LEVEL (0)Kernel Shutdown OrchestrationInternal
void __noreturn PopGracefulShutdown(void)
Кем вызывается:ntoskrnl.exe: PopExecutePowerAction
Выполняет упорядоченную остановку всех исполнительных подсистем ядра: очищает файл подкачки, рассылает пакеты IRP_MJ_SHUTDOWN драйверам, сбрасывает кэш Cache Manager, фиксирует кусты реестра и закрывает файловые системы NTFS/ReFS перед передачей управления в HAL.

2. Диспетчеризация пакетов IRP_MJ_SHUTDOWN: IoShutdownSystem ​

IoShutdownSystemntoskrnl.exe
IRQL: PASSIVE_LEVEL (0)I/O System ShutdownExported
void __fastcall IoShutdownSystem(int Phase)
Кем вызывается:ntoskrnl.exe: PopGracefulShutdown
Формирует синхронные запросы `IRP_MJ_SHUTDOWN` (код функции `0x10`) и рассылает их драйверам устройств (в фазе 0) и файловым системам / контроллерам дисков (в фазе 1).

3. Финальный переход в HAL: PopShutdownSystem ​

PopShutdownSystemntoskrnl.exe
IRQL: HIGH_LEVEL (15)Kernel-to-HAL Power HandoffInternal
void __fastcall __noreturn PopShutdownSystem(int Action)
Кем вызывается:ntoskrnl.exe: PopGracefulShutdown
Выгружает отладочные символы, уведомляет гипервизор VBS о завершении работы, настраивает флаги стирания памяти в NVRAM (MOR) и вызывает процедуру `HalReturnToFirmware`.

1.6 Аппаратный уровень HAL и ACPI/UEFI ​

  1. HalReturnToFirmware(HalPowerDownRoutine) вызывает функцию HaliAcpiSleep(PowerActionShutdownOff).
  2. Функция блокирует аппаратные прерывания (_disable()), останавливает вторичные ядра AP через IPI и настраивает регистры чипсета:
    • В порт управления ACPI PM1a_CNT (и PM1b_CNT при наличии) записывается значение:PM1a_CNT=(SLP_TYP_S5≪10)∣SLP_EN
    • На современных UEFI платформах может вызываться Runtime Service: gRT->ResetSystem(EfiResetShutdown, EFI_SUCCESS, 0, NULL).
  3. Чипсет снимает логический сигнал PS_ON# с блока питания ATX, обесточивая основные линии 12V, 5V и 3.3V (остается активной только дежурная линия 5VSB).

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