Поделиться через


Общие сведения о объектах драйверов

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

Когда диспетчер ввода-вывода вызывает подпрограмму DriverEntry драйвера, он предоставляет адрес объекта драйвера. Объект драйвера содержит хранилище для точек входа для многих стандартных процедур драйвера. Драйвер отвечает за заполнение этих точек входа.

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

Каждая стандартная подпрограмма со звездочкой рядом с его именем получает пакет запроса ввода-вывода (IRP) в качестве входных данных. Каждая из этих стандартных подпрограмм также получает указатель на целевой объект устройства для запроса ввода-вывода.

схема, иллюстрирующая объект драйвера.

Диспетчер ввода-вывода определяет тип объекта драйвера и использует объекты драйвера для регистрации и отслеживания сведений о загруженных образах драйверов. Обратите внимание, что точки входа диспетчера (DDDispatchXxx через DDDispatchYyy) в объекте драйвера соответствуют основным кодам функций (IRP_MJ_XXX), которые передаются в расположениях стека операций ввода-вывода IRPs.

Менеджер ввода-вывода передает каждый IRP сначала в диспетчерскую подпрограмму, предоставленную драйвером. Подпрограмма отправки драйвера самого низкого уровня обычно вызывает подпрограмму поддержки ввода-вывода (IoStartPacket), чтобы поставить в очередь (или передать) каждый IRP с допустимыми аргументами в подпрограмму StartIo драйвера. Подпрограмма StartIo запускает запрошенную операцию ввода-вывода на определенном устройстве. Драйверы более высокого уровня обычно не имеют подпрограмм StartIo , но они могут.