hex.pp.ua

Запуск процесса из консоли восстановления 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.

система комментирования CACKLE

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


Разделы сайта
Главная
Блог
Native API
NTFS и ReFS
Микроконтроллеры
Справочник NTDLL
Коды NTSTATUS
Разное

Избранное
NTFS Stream Explorer
Native Shell
Тенгвар

Остальное
nvpnhcknn (архив)
English pages
Контакты

Ленты atom
Лента Atom сайта Лента Atom блога



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