Объект-драйвер
Драйверы скрыты от программ пользовательского режима.
Устройства (физические, логические и виртуальные), создаваемые и управляемые
драйверами, видны программам пользовательского режима как именованные
файловые объекты. Как уже отмечалось ранее, код пользовательского режима
может получить доступ к устройству только через описатель, возвращаемый
менеджером ввода/вывода во время открытия/ создания файлового объекта,
представляющего устройство. (В структуре FILE_OBJECT есть указатель на
DEVICE_OBJECT, ассоциированный с данным файловым объектом.)
Объект-драйвер представляет в системе некоторый
драйвер Windows NT и хранит для диспетчера ввода/вывода адреса стандартных
процедур (точки входа), которые драйвер может или должен иметь в зависимости
от того, является ли он драйвером верхнего или нижнего уровней. Объект-драйвер
описывает также, где драйвер загружен в физическую память и размер драйвера.
Объект-драйвер описывается частично документированной структурой данных
DRIVER_OBJECT.
Диспетчер ввода/вывода определяет тип объект-драйвер и использует экземпляры
этого типа для регистрации и отслеживания информации о загруженных образах
драйверов. Этот объект создается менеджером ввода/вывода при загрузке
драйвера в систему, после чего диспетчер вызывает процедуру инициализации
драйвера DriverEntry и передает ей указатель на объект-драйвер. Эта процедура
устанавливает стандартные и опциональные точки входа процедур драйвера,
содержащиеся в структуре DRIVER_OBJECT, чтобы в дальнейшем диспетчер ввода/вывода
мог направлять пакеты запроса ввода/вывода IRP соответствующей процедуре.
В DriverEntry устанавливаются также точки входа для других процедур, например
для Startlo, Unload. Во время инициализации также может происходить считывание
информации в поля объекта-драйвера из базы данных реестра диспетчера конфигурации.
Пакеты IRP, направляемые стандартным процедурам, содержат, кроме всего
прочего, указатель на объект - устройство, который является устройством
назначения для конкретного запроса ввода/вывода.
Объект-драйвер является скрытым для кода пользовательского уровня, то
есть только определенные компоненты уровня ядра (в том числе и диспетчер
ввода/вывода) знают внутреннюю структуру этого типа объекта и могут получать
доступ ко всем данным, содержащимся в объекте, напрямую.
Microsoft не гарантирует неизменность недокументированных полей любых
своих структур в последующих версиях ОС. Однако фактически, некоторые
недокументированные в DDK элементы различных системных структур документированы
в другом пакете для разработчика - IPS Kit.
|