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

       

AddDevice — новая процедура в драйверах модели WDM


В драйверах модели WDM функция DriverEntry все еще служит в качестве начальной точки соприкосновения операционной системы с драйвером. Однако теперь обязанности ее сократились. В частности, роль DriverEntry теперь состоит только в том, чтобы "опубликовать" (передать Диспетчеру ввода/вывода соответствующие адреса для вызова функций по адресу) остальные процедуры драйвера. Теперь DriverEntry не создает объект устройства (Device Object) для подконтрольного аппаратного обеспечения.

Обязанности по созданию объекта устройства возложены на новую функцию драйвера AddDevice, которая теперь публикуется (обратите внимание!) в структуре расширения драйвера (Driver Extension) во время работы DriverEntry. Структура расширения драйвера является строго определенной структурой &#8212 не следует путать ее с определяемой разработчиком драйвера структурой расширения устройства (Device Extension). Пример публикации AddDevice был закомментирован в теле функции DriverEntry в главе 3. Повторим еще раз:

DriverObject-&#62DriverExtension-&#62AddDevice = MyAddDeviceRoutine;

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



NTSTATUS AddDevice IRQL == PASSIVE_LEVEL
Параметры Описание
IN PDRIVER_OBJECT pDriverObject Указатель на объект данного драйвера
IN PDEVICE_OBJECT pPDO Указатель на объект физического устройства, созданного родительским (шинным) драйвером
Возвращаемое значение STATUS_SUCCESS или код ошибки

Основной обязанностью MyAddDeviceRoutine является создание объекта устройства (теперь уже &#8212 функционального) с использованием вызова системного IoCreateDevice

и, скорее всего, подключение его к объекту физического устройства (вызовом IoAttachDevice), указатель на который поступает в параметре pPDO.

Откуда взялся объект физического устройства, указатель на который получает процедура AddDevice? Его создает шинный драйвер, когда обнаруживает подключенное PnP устройство. Зачем нужно подключаться к шинному драйверу?



Содержание раздела