Драйверы устройств в системе Windows

         

"Фиктивное" устройство


     Когда  к  порту  ввода-вывода  (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.)



Содержание раздела