Исследую, что можно делать в среде ERD-коммандера и консоли восстановления. Native приложения научился делать и проверил запуск. Теперь решил похулиганить : запускаю экзешник с DLL. Естественно вылетает, однако SoftICE показывает, что началась загрузка. Вот и хотелось бы перехватить процесс загрузки и посмотреть причины вылета. Ну и второй вопрос : стоит ли запускать приложение с native-dll собственного изготовления или оно тоже вылетит.
Во-первых, айс - это драйвер, а для драйверв есть PsSetLoadImageNotifyRoutine. И обрати внимание, что в самом начале лога, который на айсову консоль выводится, мелькают всякие интересные месаги типа: NTICE: MiMapViewOfImageSection found at XXXXXXXX NTICE: PsLoadedModuleList found at XXXXXXXX NTICE: MiUnmapViewOfSection found at XXXXXXXX ... хучит он это дело. Отсюда и знает "что происходит загрузка".
Может и хучит. Только мне удалось перехватить управление почти сразу после того, как SoftIce сказал, что загружена ntdll.dll ( длина загрузки 0х7c000). Однако дамп памяти показывает только заголовок - 0х1000 байт А по протоколу айса уже грузятся драйвера. Возможно конечно, что тут хитрая игра защиты памяти ?! Но вернемся к тому, ради чего это все затевалось. Решил я выяснить, где происходит авария. И оказалось, что подпрограмма RtlCreateUserProcess делает совсем не то, что можно подумать. Она грузит из файла только одну секцию ( там где список DLL) и грузит ntdll ! Айс радостно кричит, что "load32 .... autochk.exe" Однако тут память можно посмотреть - в секции кода пока "мусор" ! Возращаюсь к моему вопросу. Я пометил адрес , при переходе на который айс выдает сообщение и теперь уже сам выясню секрет Одновременно я понял, что для запуска проги не native, последовательность действий из smss ( erd-commander) не годится и надо смотреть, как система грузит kernel32.dll - без него труба.
Быcтрее всего, дело в том, что система не делает ничего до тех пор, пока это не станет абсолютно необходимо. Для отображения длл достаточно прочитать её заголовок и отобразить в память, но реально отображение (т.е. копирование из файла в память) произойдет тогда, когда к этой памяти будет обращение. Тогда произойдет исключение и его обработчик подгрузит эту и ещё несколко страниц из файла. Т.к. к заголовку уже было обращение, он уже присутствует в памяти, а всё остальное нет. Думаю, что примерно так.