Эксперимент по запуску процесса из 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
Избранное
Остальное
Лента atom