Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
227
Добавлен:
20.02.2016
Размер:
105.47 Кб
Скачать

Лекция №5. Структура драйвера. Основные точки входа. Точка входа DriverEntry.

Данная лекция может быть рассмотрена как одно большое оглавление последующих лекций.

На этой лекции будет рассмотрено:

  • Ограничения, налагаемые на драйвер

  • Точки входа драйвера. Описание наиболее общих точек входа драйверов ядра Windows NT. Будут указаны точки входа, которые должны быть реализованы обязательно, и точки входа, наличие которых зависит от назначения драйвера.

  • Назначение и взаимосвязь основных объектов. Прежде чем мы сможем обсуждать подробности каждой точки входа драйвера на следующих лекциях, важно понять общие концепции организации драйверов устройств Windows NT.

  • Точка входа DriverEntry

[5.1] Ограничения, налагаемые на драйвер

  • Драйвер режима ядра не может использовать API пользовательского уровня или стандартные библиотеки времени исполнения языка С. Можно использовать только функции ядра.

  • Драйвер не может осуществлять операции с числами с плавающей точкой. Попытка сделать это может вызвать аварийную остановку системы. Причина – в основе реализации архитектуры MMX. На вдаваясь в подробности можно сказать, что в этой архитектуре для обозначения регистров MMX использованы те же обозначения, что и для использования регистров FPU. Переключение между использованием регистров MMX/FPU, производимое на пользовательском уровне, невидимо для драйвера.

  • Драйвер не может манипулировать напрямую физической памятью. Однако, он может получить виртуальный адрес для любого физического адреса и манипулировать им.

  • Код драйвер не должен долгое время работать на повышенных уровнях IRQL.

Другие ограничения можно посмотреть в [Developing Windows NT Device Driver, chapter 5, Driver Limitation]

[5.2] Назначение и взаимосвязь основных объектов

Рис. 1

Драйвер – это особый тип динамически подключаемой библиотеки (DLL). Фактически, это DLL, удовлетворяющая ряду дополнительных требований и меющая расширение “.sys”.

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

Когда происходит загрузка модуля? Это определяется соответствующими данному драйверу настройками в реестре (ключ Start). Как уже говорилось, этими настройками управляет Service Control Manager (SCM), хотя они могут быть изменены и вручную.

При загрузке драйвера в качестве первого параметра ему передается указатель на объект-драйвер, который представляет данный конкретный драйвер.

[5.2.1] Объект-драйвер

Объект-Драйвер описывает, где драйвер загружен в физическую память, размер драйвера и основные точки входа. Объект-драйвер создается диспетчером В/В и описывается частично документированной структурой данных DRIVER_OBJECT.

Примечание.

Microsoft не гарантирует неизменность недокументированных полей любых своих структур в последующих версиях ОС. Однако фактически, некоторые недокументированные в DDK элементы различных системных структур документированы в другом пакете для разработчика – IFS Kit.

Внутри функции DriverEntry происходит инициализация всего, что необходимо для выполнения драйвером его предназначения. В этой функции определяются стандартные и опциональные точки входа драйвера, в особенности – точки входа Dispatch, являющиеся частью структуры DRIVER_OBJECT. Кроме того, обычно именно здесь происходит создание одного или нескольких объектов-устройств.

Соседние файлы в папке Лабы по драйверам