"Фиктивное" устройство
Когда к порту ввода-вывода (141) устройства осуществляется доступ виртуальной машиной VM (либо в реальном, либо в защищенном режиме), то машина вызывает программу драйвера VxD Port_IO_Callback (см. Листинг 6). В этой программе подпрограмма Dispatch_Byte_IO сводит большое количество возможных типов доступа ввода-вывода (а именно: byte, word, dword, string и т.д.) к двум: байтовому вводу и байтовому выводу.
Для устройства из примера байтовый ввод представляет собой чтение из регистра состояния устройства. Он возвращает просто переменную, которая сохраняется в памяти.
Байтовый вывод - немного более сложная операция, так как представляет фактическую работу устройства. При запуске устройства также запускается таймер, который выполняет обратный вызов (к коду TimeoutProc) в течении 1/10 секунды и устанавливает состояние BUSY. Если вывод подтверждает прием прерывания, то производится очистка виртуального запроса на прерывание путем вызова кода VPICD_Clear_Int_Request и очистка состояния в регистре состояния.
Обратный вызов кода TimeoutProc представляет завершение операции ввода-вывода на устройстве и именно в данный момент он моделирует прерывание аппаратного оборудования к виртуальной машине VM путем вызова кода VPICD_Clear_Int_Request и очистки состояния занятости устройства. Драйвер устройства в приложениях dostest и wintest будет обычно обрабатывать прерывание путем подтвержения приема его (посылая EOI) и повторного запуска процесса на всем протяжении снова.
Следует отметить процедуры VxD2_VInt_Proc и VxD2_IRET _Proc. На данные две процедуры существует ссылка в структуре, которая передается коду VPICD_Virtualize_IRQ. Они вызываются в начале и конце процесса виртуализации прерывания в виртуальную машину VM. Все их функции сводятся к увеличению и сохранению приоритета виртуальной машины VM, которая временно обрабатывает данное прерывание. Таким способом драйвер VxD может управлять приоритетом виртуальной машины VM, которая считается соответствующей. (Всегда желательно, чтобы программа обслуживания прерывания в любой виртуальной машине VM имела приоритет выше, чем приоритет обычной обработки в других виртуальных машинах VM.)