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



Роль драйверных слоев в модели WDM - часть 5


Вообще говоря, Диспетчер ввода/вывода автоматически устанавливает необходимое значение StackSize (то есть StackSize нижнего объекта плюс 1) в подключаемых к стеку объектах устройств, если это делается при помощи вызовов IoAttachDeviceToDeviceStack

или IoAttachDevice. Но в том случае, если драйвер пытается обойтись без этих вызовов, то должен установить StackSize своего объекта явным образом.

Таблица 9.4. Прототип функции IoAttachDevice

NTSTATUS IoAttachDevice IRQL == PASSIVE_LEVEL
Параметры Выполняет подключение вновь созданного объекта устройства, pNewDevice
IN PDEVICE_OBJECT pNewDevice Указатель на подключаемый объект устройства
IN PUNICODE_STRING TagDevName

Имя целевого устройства

OUT PDEVICE_OBJECT *ppTagDevice Указатель на объект устройства, к которому подключается новое устройство (точнее, указатель на место для указателя)
Возвращаемое значение • STATUS_SUCCESS

• STATUS_Xxx &#8212 код ошибки

Второй способ подключения к стеку устройств через объект устройства с известным именем осуществляется при помощи вызова IoAttachDevice, прототип которого представлен в таблице 9.4.

В результате вызовов IoAttachDeviceToDeviceStack или IoAttachDevice

будет найден объект устройства, находящийся на вершине стека над указанным целевым объектом (по имени или по указателю). К нему и будет подключен новый объект устройства. Соответственно, разработчик, подключающий свой объект устройства к устройству в "середине" стека и надеющийся, что таким образом через его драйвер будут "протекать" IRP запросы от вышестоящих драйверов к нижестоящим, глубоко заблуждается. На самом деле, для достижения этой цели необходимо не просто выполнить подключение к нужному объекту устройства, но и сделать это в строго определенный момент загрузки &#8212 ранее, чем будет выполнена загрузка вышестоящих драйверов, чьи запросы предполагается перехватывать. Однако рассмотрение данной проблемы выходит за рамки данной книги.

Полученный указатель на объект устройства, к которому произведено подключение, следует сохранить, поскольку он может понадобиться, например, в обработчике запросов IRP_MJ_PNP, см.ниже. Это можно сделать в структуре расширения объекта устройства.

Заключительной задачей функции AddDevice драйверов модели WDM является создание символьного имени-ссылки (symbolic link name), если это необходимо, для вновь созданных и доступных устройств. Для этого используется вызов IoCreateSymbolicLink, применение которого было продемонстрировано ранее в DriverEntry, глава 3.




Содержание  Назад  Вперед