Запуск процесса из консоли восстановления Windows

Эксперимент по запуску процесса из Recovery Console




В Windows существует консоль восстановления — особый режим командной строки для диагностики и исправления сбоев. Этот режим можно запускать с установочного диска Windows, а можно установить на системный раздел и иметь возможность запуска этого режима в виде опции загрузки. Консоль восстановления в этом случае прописывается в boot.ini как вариант загрузки компьютера.

Консоль восстановления это командная строка на чёрном экране. Похоже на режим загрузочного экрана (который в современных версиях Windows чёрного цвета), в котором исполняются native-приложения до окна входа в систему (типа проверки дискового раздела после перезагрузки). Я решил проверить, возможна ли запуск и работа native-приложений из-под консоли восстановления. Проще говоря, возможно ли запустить программу в консоли восстановления. Ещё я предпринимал попытку запустить native-приложение в ReactOS.

Для этого следует установить консоль восстановления на жёсткий диск. Вставляется установочный диск Windows, выполняется команда X:\i386\winnt32.exe /cmdcons и консоль восстановления оказывается установленной в папку C:\cmdcons. Сразу можно обратить внимание на то, что в этой папке содержится два файла .exe, а именно autochk.exe и autofmt.exe. Это ни что иное, как native-версии утилит chkdsk и format, для проверки и форматирования дисков. Раз в папке консоли восстановления лежат native-приложения, значит, соотвествующая функциональность консоли реализуется через их запуск.

Вообще, в консоли восстановления за обработку команд отвечает файл spcmdcon.sys. Это драйвер, а не native-приложение. Модуль использует функции другого драйвера, setupdd.sys, который содержит функции с говорящими названиями SpvidDisplayString, WriteNtfsBootSector и т. п. Было бы заманчиво использовать эти функции и написать свою замену spcmdcon.sys, но API этих функций неизвестно.

Подмена autochk.exe

Нужно было проверить, что будет, если подменить autochk.exe на свою программу. Написал нативный Hello World, вставил в папку cmdcons вместо autochk.exe, загрузился в режиме консоли восстановления.

#include <ntndk.h>

void NtProcessStartup( PVOID Argument ) 
{
  UNICODE_STRING unic;
  RtlInitUnicodeString(&unic, L"Hello, world!\n");
  NtDisplayString(&unic);
  return;
}

Набрал в консоли восстановления команду chkdsk C: /P, которая должна вызвать процесс autochk.exe для выполнения проверки диска. Консоль восстановления выдала мне сообщение о невозможности проведения проверки. Строка «Hello, world!» не появилась на экране. Тогда я предположил, что процесс запускается, просто не работает вывод на экран, так как вывод сообщений реализован иначе, не как в режиме синего экрана. Тогда я скомпилировал другое приложение, которое должно было просто выключить компьютер:

#include <ntndk.h>

void NtProcessStartup( PVOID Argument ) 
{
  BOOLEAN b;
  RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &b);
  NtShutdownSystem(ShutdownNoReboot);
  return;
}

Положил его вместо autochk.exe, перезагрузился в консоль восстановления, набрал chkdsk C: /P. Компьютер выключился.

Тогда я попробовал запустить таким же точно образом свой Native Shell. Выяснил, что он реагирует на ввод команд с клавиатуры, но также ничего не выводит на экран.

Выводы

Выводы из эксперимента такие: возможен запуск native-процесса из консоли восстановления. Вывод на экран не работает, так как механизм вывода не позволяет использовать функцию NtDisplayString. Версии программ autochk.exe и autofmt.exe, лежащие в каталоге консоли восстановления — те же самые native-приложения, что лежат в system32 папки Windows. Но вывод сообщений при работе этих приложений не совпадает с выводом в случае запуска из Windows. Следовательно, вывод в консоли восстановления генерируется самой консолью восстановления. Как она узнаёт об этапах проверки, не знаю. Но сообщения на экран выводит spcmdcon.sys, а не autochk.exe.

Было бы любопытно найти способ выводить сообщения на экран в консоли восстановления, а также сразу запускать своё собственное приложение, минуя командную строку spcmdcon.sys.



Автор: амдф
Дата: 14.02.2011


При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт.