драйвере можно исключить его запуск,
Первое, однако, более удобно, т.к. в случае ошибки в VXD- драйвере можно исключить его запуск, отредактировав файл SYSTEM.INI в MS DOS.
При установке виртуальных драйверов VMM посылает драйверам следующие три сообщения в порядке списка.
SysCriticalInit - посылается при переключении в защищенный режим, но до разрешения прерываний.
Device_Init - посылается после разрешения прерываний. Именно это сообщение чаще всего используется виртуальными драйверами для проведения начальной инициализации.
Init_Complete - последнее сообщение, посылаемое виртуальным драйверам при загрузке системы.
Получив сообщение и выполнив необходимую работу, драйвер должен сбросить флаг переноса и возвратить управление системе.
Перед тем как произвести выгрузку, статические виртуальные драйверы также получают сообщения.
System_Exit2 - сообщение посылается перед выгрузкой системы. Микропроцессор находится еще в защищенном режиме.
Sys_Critical_Exit2 - следующее сообщение перед выгрузкой системы.
Device_Reboot_Notify2 - сообщают виртуальным драйверам, что система "собирается" выгружаться. Прерывания еще доступны.
Crit_Reboot_Notify2 - аналогичное предыдущему сообщению, но прерывания недоступны.
Обратимся теперь к программе на Рисунок 4.7.3. Этот драйвер выводит сообщение при активизации виртуальной машины (например, создание консоли или просто запуск DOS-приложения) и при ее деактивизации. В драйвере мы использовали две сервисные функции: получить дескриптор системной виртуальной машины и вывести сообщение. Рассмотрим эти функции:
Get_sys_vm_handle - получить дескриптор системной виртуальной машины. Причем дескриптор возвращается в регистре EBX.
SHELL_Message — вывести сообщение. Параметры хранятся в регистрах:
EBX — дескриптор виртуальной машины. EAX - флаг сообщения, например MB_OK. ECX - 32-битный адрес строки-сообщения. EDI - 32-битный адрес строки-заголовка. ESI - адрес функции - реакции на действие пользователя. Если функции нет, тогда 0. EDX - адрес данных, которые будут посылаться функции.
И еще, при выходе драйвер должен очищать флаг переноса. В нашем случае очистка флага переноса обусловлена правильным выполнением функции SHELL_Message.
Содержание Назад Вперед