Hook Int 10h вызывает сбой загрузки окна

Я пытаюсь написать очень простой загрузочный код, который перехватывает INT10, как показано ниже:

New_int10:

Pushf
Cli
Call [CS:old_Int10]
Iret

Код работает нормально для всех случаев, однако, когда я пытаюсь загрузиться в Window. Система зависает. Я отлаживаю в Bochs и замечаю, что ОС пытается переключиться на v8086 режим затем вызвать Int10 и с моим новым обработчиком Int10 (в address 0x97400) сбой выполнения (это не относится к обработчику, который вызывает зависание системы, кажется, что некоторое отображение в защищенном режиме не корректно).

Если не изменить INT10 Я могу вмешаться в int10 handler (оригинальный обработчик в address 0xC0152).

Я что-то пропустил?

Я уже зацепил Int15h зарегистрировать область нового обработчика сe820 type = 2

Обновление: я сделал больше отладки и выяснил... когда Windows (это происходит только при загрузке Windows в безопасном режиме) переключается в режим v8086, он устанавливает VME (в CR4) = 1,IPOL=3 и программа переходит на 0x97400, К сожалению, отображение страниц в настоящее время сопоставляет этот адрес с другим физическим адресом 0x7dd2000... поэтому приложение сходит с ума. Адрес 0xC0000 по-прежнему отображается на 0xC0000, что объясняет, почему, если мы не изменим INT10, окно может загрузиться.

Мой вопрос: есть ли способ сообщить Window Boot Loader, чтобы не переназначать адрес 0x97400?

Спасибо

1 ответ

Ну наконец-то я решил проблему.

Я должен скопировать edba из 0x9fc00 в 0x97400 и настроить 0x40e на новое место 0x97400. Затем я перемещаю свой код рядом с EDBA и обновляю его размер. Тогда код может работать.

Я думаю, что Window Boot Loader попытается сопоставить 640K с новым местоположением, которое 0x7dd2000. Затем он копирует только bda (от 0 до 4ff) и e bda (от 0x9fc00 до 0xa000) в новое местоположение... поэтому переместите edba и обновите размер edba, выполняя задание.

Другие вопросы по тегам