Программирование драйверов Windows


Драйверы: крупный план. Unix-Linux, DOS-Windows - часть 2


Как ни удивительно покажется это рядовому пользователю операционной системы Windows, но и в ней предлагается точно такой же механизм. Для доступа к драйверу из своего приложение пользователь прибегает к помощи функции CreateFile

(это могла бы быть функция OpenFile, но это название морально устарело, поскольку использовалась в старых 16-тиразрядных версиях Windows). Правда, имя файла, который предполагается "открыть", выглядит странно, и на жестком диске такого файла отыскать невозможно - он существует лишь в недрах операционной системы и выглядит, например, как "\\\\.\\myDevice". (Операционная система понимает его как символьную ссылку для идентификации конкретного драйвера, привлекаемого к работе.) И хотя дальнейшие операции, сформулированные создателем пользовательского приложения как вызовы read()-write(), все-таки преобразуются операционной системой в специальные запросы к драйверу, необходимо признать: формально процесс похож на работу с файлом.

Наблюдение 2. Драйверы стали легко заменяемой запасной частью в операционной системе. Если раньше и были различия между продуктами Microsoft и юниксоидными системами (драйверы в операционных системах Microsoft изначально были "подвижно-сменными", но в UNIX и ранних версиях Linux при их замене надо было заново выполнять перекомпиляцию ядра), то сейчас такие различия исчезли. При сохранении некоторых особенностей инсталляции, драйверы теперь повсеместно могут быть удалены/добавлены в систему редактированием одной записи в специальных системных файлах. Более того, загрузка "по требованию" (по запросу пользовательской программы) становится практически общей чертой Windows/Unix/Linux. Даже операционные системы реального времени, например, QNX также используют методику сменных драйверов.

Наблюдение 3. Концепция существования режима ядра (с большими функциональными возможностями и относительной бесконтрольности) и пользовательского режима (с жестким контролем со стороны системы) присутствует в Windows/Unix/Linux с незапамятных времен.Если внимательно посмотреть на то, как в Linux реализуется драйвер, то увидим, что это всего лишь модуль ядра, который имеет некое (дополнительное) отражение в виде файла в директории /dev/. Если посмотреть теперь на драйвер (режима ядра) в операционной системе Windows, то становится понятно: это не просто драйвер, это возможность войти в режим ядра со своим программным кодом. От судьбы не уйдешь. Microsoft не предоставила явной возможности создавать модули ядра, однако закрыть эту брешь в виде драйверов - невозможно! В великолепной книге Свена Шрайбера "Недокументированные возможности Windows 2000" как раз эксплуатируется эта "черта личности" драйвера Windows.

Завершая мини-экскурс в сравнительный анализ драйверов разных популярных ОС, нельзя не упомянуть и об общем для всех систем механизме воздействия на драйвер при помощи IOCTL запросов (работа с IOCTL в Windows будет подробно рассмотрена в главе 8).




Начало  Назад  Вперед