1. Полное завершение работы (Shutdown S5 & Reboot)
Стек полного выключения Windows NT охватывает сквозной конвейер: от клика пользователя в меню «Пуск» оболочки explorer.exe через закрытие приложений сессии, выгрузку служб SCM, флашинг дисковых кэшей и кустов реестра до аппаратного обесточивания через ACPI / UEFI.
1.1 Полная схема вызовов
1.2 Инициация в пользовательском режиме (explorer.exe)
Когда пользователь нажимает кнопку выключения:
- Оболочка
explorer.exeвызывает API-функциюExitWindowsEx(EWX_SHUTDOWN | EWX_POWEROFF, SHTDN_REASON_FLAG_PLANNED). - Функция формирует LPC/ALPC-запрос к подсистеме
csrss.exeи RPC-вызов диспетчеруwinlogon.exe.
1.3 Завершение пользовательской сессии (winlogon.exe и csrss.exe)
- Опрос приложений (
WM_QUERYENDSESSION):csrss.exeобходит список GUI-потоков в интерактивной сессии и отправляет сообщениеWM_QUERYENDSESSION. Если приложение возвращаетFALSEи не зависло,LogonUI.exeотображает экран предупреждения с предложением принудительно закрыть программы. - Закрытие приложений (
WM_ENDSESSION): При подтверждении приложения получаютWM_ENDSESSION, сохраняют несохраненные данные и завершаются черезExitProcess(0). - Принудительное завершение: По истечении таймаута
WaitToKillAppTimeoutоставшиеся неотвечающие процессы завершаются ядром черезNtTerminateProcess. - Выгрузка профиля пользователя:
winlogon.exeвызываетUnloadUserProfile, фиксирует кустNTUSER.DATв реестре, закрывает оконную станциюWinSta0и переходит к завершению Session 0.
1.4 Остановка служб и Session 0 (wininit.exe и services.exe)
wininit.exeвызываетWinInitNotifyShutdown, уведомляя диспетчер служб Service Control Manager (services.exe).- Фаза Preshutdown (
SERVICE_CONTROL_PRESHUTDOWN): Службы, зарегистрировавшие расширенный контроль (базы данных SQL Server, службы Hyper-V, антивирусы), получают уведомлениеSERVICE_CONTROL_PRESHUTDOWN. Диспетчер ожидает их завершения в порядке, заданном параметром реестраPreshutdownOrder, выделяя до нескольких минут (PreshutdownTimeout). - Фаза Shutdown (
SERVICE_CONTROL_SHUTDOWN): Всем остальным активным службам параллельно отправляетсяSERVICE_CONTROL_SHUTDOWN. - Остановка подсистемы безопасности:
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) Выполняет упорядоченную остановку всех исполнительных подсистем ядра: очищает файл подкачки, рассылает пакеты IRP_MJ_SHUTDOWN драйверам, сбрасывает кэш Cache Manager, фиксирует кусты реестра и закрывает файловые системы NTFS/ReFS перед передачей управления в HAL.
▶PopGracefulShutdownntoskrnl.exe__noreturnINTERNAL
Развернуть псевдокод
Поэтапная остановка подсистем ядра, сброс файловых систем и реестра, переход в HAL
2. Диспетчеризация пакетов IRP_MJ_SHUTDOWN: IoShutdownSystem
IoShutdownSystemntoskrnl.exe
IRQL: PASSIVE_LEVEL (0)I/O System ShutdownExported
void __fastcall IoShutdownSystem(int Phase) Формирует синхронные запросы `IRP_MJ_SHUTDOWN` (код функции `0x10`) и рассылает их драйверам устройств (в фазе 0) и файловым системам / контроллерам дисков (в фазе 1).
▶IoShutdownSystemntoskrnl.exe__fastcallEXPORTED
Развернуть псевдокод
Рассылка пакетов IRP_MJ_SHUTDOWN драйверам устройств и базовым файловым системам
3. Финальный переход в HAL: PopShutdownSystem
PopShutdownSystemntoskrnl.exe
IRQL: HIGH_LEVEL (15)Kernel-to-HAL Power HandoffInternal
void __fastcall __noreturn PopShutdownSystem(int Action) Выгружает отладочные символы, уведомляет гипервизор VBS о завершении работы, настраивает флаги стирания памяти в NVRAM (MOR) и вызывает процедуру `HalReturnToFirmware`.
▶PopShutdownSystemntoskrnl.exe__fastcall __noreturnINTERNAL
Развернуть псевдокод
Уведомление гипервизора и вызов HalReturnToFirmware
1.6 Аппаратный уровень HAL и ACPI/UEFI
HalReturnToFirmware(HalPowerDownRoutine)вызывает функциюHaliAcpiSleep(PowerActionShutdownOff).- Функция блокирует аппаратные прерывания (
_disable()), останавливает вторичные ядра AP через IPI и настраивает регистры чипсета:- В порт управления ACPI
PM1a_CNT(иPM1b_CNTпри наличии) записывается значение: - На современных UEFI платформах может вызываться Runtime Service:
gRT->ResetSystem(EfiResetShutdown, EFI_SUCCESS, 0, NULL).
- В порт управления ACPI
- Чипсет снимает логический сигнал
PS_ON#с блока питания ATX, обесточивая основные линии 12V, 5V и 3.3V (остается активной только дежурная линия 5VSB).