События, управляющие устройством
По мере того, как система Windows в своей работе проходит различные стадии, начиная со стадии инициализации самой системы, через инициализацию виртуальной машины VM и так далее, каждый установленный драйвер VxD вызывается неоднократно, а именно один раз на каждую стадию. В таблице, приведенной ниже, перечисляются фазы системы Windows и главные события, для которых вызывается каждый драйвер VxD.
Таблица
Управляющие сообщения драйвера VxD
-------------------+--------------------------------------------------
Sys_Critical_Init | Первое управляющее событие; прерывания
| отключаются. Драйвер VxD определяет готовность
| устройства.
-------------------+--------------------------------------------------
Device_Init | Прерывания разрешаются; драйвер VxD инициализиру-
| ет устройство; могут быть вызваны программы и
| драйверы системы DOS.
-------------------+--------------------------------------------------
Init_Complete | Указывает, что все драйверы VxD прошли стадию
| Device_Init.
-------------------+--------------------------------------------------
System_Exit | Указывает, что система Windows готовится к
| закрытию и возврату в систему DOS. Память для
| системы DOS восстановлена в состояние, которое
| было до работы системы Windows.
-------------------+--------------------------------------------------
Sys_Critical_Exit | Последнее управляющее событие; прерывания
| отключаются.
-------------------+--------------------------------------------------
Create_VM | Вызывается перед моментом создания виртуальной
| машины VM; драйвер VxD указывает, доступны ли
| ресурсы для создания виртуальной машины VM.
-------------------+--------------------------------------------------
VM_Critical_Init | Вторая фаза создания виртуальной машины VM.
-------------------+--------------------------------------------------
VM_Init | Третья фаза создания виртуальной машины VM.
Sys_VM_Init | Драйвер VxD может аварийно завершить работу
| виртуальной машины VM.
-------------------+--------------------------------------------------
Query_Destroy | Позволяет драйверу VxD предупредить пользователя
| о затруднениях при разрушении виртуальной машины
| VM.
-------------------+--------------------------------------------------
VM_Terminate | Первая стадия успешного завершения виртуальной
Sys_VM_Terminate | машины VM. Если это системная виртуальная
| машина VM, то сообщение указывает, что
| производится нормальное, вызванное пользователем,
| завершение системы Windows.
-------------------+--------------------------------------------------
VM_Not_Executeable | Виртуальная машина VM закрывается. Первая стадия
| аварийного завершения виртуальной машины VM.
-------------------+--------------------------------------------------
Драйвер VxD примера выполняет управление только фазой Device_Init. На этой стадии устанавливается связь с портом ввода-вывода и уровнем прерывания 11, а также производится их виртуализация. Обычно драйвер VxD виртуализирует порты ввода-вывода и прерывание в соответствии с физическим аппаратным оборудованием. Но в данном случае драйвер VxD может виртуализировать и делает это с портом и прерыванием, которые не имеют соответствующего подключенного аппаратного оборудования.
Код Install_IO_Handler вызывается, чтобы виртуализировать единственный порт ввода-вывода. Затем всякий раз, когда осуществляется доступ к описанному порту ввода-вывода из виртуальной машины VM, программа управления виртуальной машиной системы Windows (Virtual Machine Manager - VMM) вызывает обратно драйвер VxD для того, чтобы разрешить ему имитировать операции ввода-вывода.
Код VPICD_Virtualize_IRQ вызывается, чтобы виртуализировать уровень прерывания. Выполняя его, можно имитировать прерывание аппаратного оборудования (в частности IRQ 11) в виртуальной машине.