Драйвер видеоконтроллера
Драйвер видеоконтроллера оказывает решающее влияние на производительность Windows как операционной системы с графическим интерфейсом пользователя. Поэтому он составляется, как правило, на языке ассемблера.
В состав дистрибутива Windows входят драйверы лишь для ограниченного набора видеоконтроллеров. В частности, имеется драйвер для видеоконтроллера VGA, с которым совместимы практически все современные видеоконтроллеры. Для реализации режимов SVGA производители видеоконтроллеров создают собственные драйверы и поставляют их в комплекте со своими изделиями.
Как мы уже говорили в 14 томе "Библиотеки системного программиста", приложения Windows работают с видеоконтроллером и принтером через интерфейс графических устройств GDI, реализованный как DLL-библиотека gdi.exe. Этот интерфейс обеспечивает независимость приложений от особенностей физической аппаратуры.
Модули интерфейса GDI не работают с регистрами видеоадаптера или принтера, а обращаются к соответствующим драйверам. Заметим, что драйвер видеоадаптера вызывается для выполнения операций достаточно высокого уровня, например, рисования линии или закрашивания области. Если драйвер не поддерживает нужную операцию, GDI выполняет ее самостоятельно. Однако только драйвер может выполнять операции наиболее быстрым образом, так как GDI "не знает" особенностей аппаратуры.
Если Windows работает в расширенном режиме, в дело включается виртуальный драйвер видеоконтроллера, который выполняет операции ввода/вывода над регистрами видеоконтроллера и осуществляет запись данных в видеопамять. В составе DDK есть исходные тексты виртуальных драйверов для некоторых типов видеоконтроллеров, таких как CGA, EGA и VGA. Основная задача виртуального драйвера видеоконтроллера заключается в координации коллективного доступа к аппаратуре видеоконтроллера со стороны виртуальных машин MS-DOS и системной виртуальной машины, в которой работают приложения Windows.
В последнее время в качестве видеоконтроллера обычно используется так называемый ускоритель Windows (Windows Accelerator), способный выполнять многие графические операции на аппаратном уровне без загрузки центрального процессора компьютера.
При этом значительно увеличивается скорость вывода изображения в среде Windows. Разумеется, для того чтобы задействовать новые возможности акселераторов Windows, необходимо подключить соответствующие драйверы, которые всегда поставляются вместе с видеоконтроллером.
Драйверы экспортируют многие функции, которые по выполняемым действиям можно отнести к интерфейсу GDI, например, BitBlt, ExtTextOut, SetPalette, StretchDIBits и многие другие. При этом достигается максимальная производительность, так как только разработчик видеоконтроллера знает все его аппаратные особенности.
Так как драйвер видеоконтроллера выполняет многие критические функции, возможные ошибки, допущенные при создании драйвера, могут сказаться на работе любых приложений Windows. Авторам известна ошибка в одной из версий драйвера Cirrus Logic, влияющая на режим предварительного просмотра документа текстового процессора Word for Windows. Поэтому если вы обнаружили, что ваше приложение работает неправильно (рисует не то, что нужно или даже завершается с сообщением о нарушении защиты памяти), проверьте его работу с другим драйвером или при другом разрешении.
Помимо экспортирования функций, связанных с рисованием на экране, драйвер "экспортирует" многие ресурсы, такие как шрифты, битовые изображения, пиктограммы и другие. При изображении таких стандартных органов управления, как системные меню, движки полос просмотра, заголовки окон и курсоры, Windows пользуется ресурсами, определенными в драйвере видеоконтроллера. При установке видеоконтроллера в системный каталог Windows копируются файлы шрифтов, соответствующие текущему разрешению.
Последнее обстоятельство приводит в замешательство некоторых пользователей, работающих с символами кириллицы. Установив Windows и драйвер видеоконтроллера VGA для разрешения 640х480 пикселов, такие пользователи выполняют русификацию Windows при помощи таких продуктов типа CyrWin, ParaWin ит. п. В ходе этой процедуры многие шрифты из системного каталога Windows заменяются на другие, сходные по начертанию, но имеющие в своем составе символы кириллицы.
Если теперь установить другой драйвер видеоконтроллера, например, для разрешения 800х600 пикселов, опять произойдет замена шрифтов. На этот раз в системный каталог Windows будут скопированы шрифты, которые поставляются вместе с драйвером видеоконтроллера. Как правило, эти шрифты не содержат символов кириллицы, поэтому русские буквы исчезнут с экрана.
Следовательно, всякий раз, когда вы меняете драйвер видеоконтроллера, необходимо заново устанавливать приложение, отвечающее за использование символов кириллицы.
Еще одна важная задача, выполняемая драйвером видеоконтроллера (вернее, отдельным модулем, который устанавливается вместе с драйвером) заключается в сохранении и восстановлении содержимого экрана при переключении от виртуальной машины MS-DOS к системной виртуальной машине, в рамках которой работают все приложения Windows.
Сохранение и восстановление содержимого экрана виртуальной машины MS-DOS выполняется модулем, который называется Display Grabber. Мы будем называть его модулем сохранения экрана.
В реальном и стандартном режиме работы Windows модуль сохранения экрана представляет собой односегментную программу реального режима, составленную на языке ассемблера. По своей структуре она больше всего напоминает com-программу для MS-DOS.
В расширенном режиме работы Windows виртуальные машины MS-DOS могут работать как в полноэкранном, так и в оконном режиме. При этом используется другой модуль сохранения экрана, выполненный в виде обычной DLL-библиотеки. Его основная задача заключается в преобразовании формата изображения к виду, пригодному для отображения в окне. Само же отображение выполняется драйвером видеоконтроллера.
Другая важная задача, выполняемая модулем сохранения экрана расширенного режима - копирование содержимого окна виртуальной машины MS-DOS в универсальный буфер обмена Clipboard. Можно также скопировать произвольный фрагмент окна, выделенный пользователем. Функции выделения фрагмента окна в расширенном режиме работы Windows также выполняются модулем сохранения экрана.
Драйверам видеоконтроллера можно было бы посвятить отдельную книгу, так как решаемые этим драйвером задачи очень сложны. Однако, как мы уже говорили, вы едва ли будете составлять такие драйверы самостоятельно. Всю необходимую информацию при необходимости вы сможете найти в документации, которая поставляется в составе DDK.