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


структура DRIVER_OBJECT (wdm.h)

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

Объект драйвера частично непрозрачн. Записи драйверов должны знать о некоторых членах объекта драйвера, чтобы инициализировать драйвер и выгрузить его, если драйвер можно выгрузить. Следующие члены объекта драйвера доступны драйверам.

Синтаксис

typedef struct _DRIVER_OBJECT {
  CSHORT             Type;
  CSHORT             Size;
  PDEVICE_OBJECT     DeviceObject;
  ULONG              Flags;
  PVOID              DriverStart;
  ULONG              DriverSize;
  PVOID              DriverSection;
  PDRIVER_EXTENSION  DriverExtension;
  UNICODE_STRING     DriverName;
  PUNICODE_STRING    HardwareDatabase;
  PFAST_IO_DISPATCH  FastIoDispatch;
  PDRIVER_INITIALIZE DriverInit;
  PDRIVER_STARTIO    DriverStartIo;
  PDRIVER_UNLOAD     DriverUnload;
  PDRIVER_DISPATCH   MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT, *PDRIVER_OBJECT;

Члены

Type

Указывает идентификатор типа объекта для объекта driver. Диспетчер ввода-вывода задает это поле при выделении объекта драйвера. Драйверы не должны использовать или изменять это поле.

Size

Задает размер в байтах структуры объекта драйвера. Диспетчер ввода-вывода задает это поле при выделении объекта драйвера. Драйверы не должны использовать или изменять это поле.

DeviceObject

Указатель на первый объект устройства в связанном списке объектов устройств, созданных драйвером. Это поле связывает все устройства, созданные одним драйвером в списке. Этот элемент автоматически обновляется диспетчером операций ввода-вывода при успешном вызове IoCreateDevice . Драйвер может использовать этот элемент и член NextDeviceDEVICE_OBJECT для обхода полного списка всех объектов устройств, созданных драйвером. Это особенно полезно во время выгрузки драйвера, чтобы убедиться, что все объекты устройства правильно очищаются.

Flags

Содержит системные флаги, описывающие различные атрибуты и состояния драйвера. Это поле предоставляет расширяемое расположение флага для объектов драйвера. Эти флаги задаются и поддерживаются диспетчером ввода-вывода и другими системными компонентами. Драйверы не должны напрямую изменять это поле.

DriverStart

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

DriverSize

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

DriverSection

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

DriverExtension

Указатель на расширение драйвера. Единственным доступным членом расширения драйвера является DriverExtension-AddDevice>, в котором подпрограмма DriverEntry драйвера хранит подпрограмму AddDevice драйвера.

DriverName

Содержит имя строки Юникода драйвера. Это поле используется потоком журнала ошибок для определения имени драйвера, к которому привязан запрос ввода-вывода. Обычно это форма \Driver\DriverName, где DriverName соответствует имени службы драйвера в реестре. Диспетчер ввода-вывода задает это значение на основе конфигурации реестра драйвера.

HardwareDatabase

Указатель на путь \Registry\Machine\Hardware к сведениям о конфигурации оборудования в реестре.

FastIoDispatch

Указатель на структуру FAST_IO_DISPATCH , определяющую быстрые точки ввода-вывода драйвера. Этот необязательный указатель указывает на массив альтернативных точек входа в драйвер для поддержки быстрого ввода-вывода. Быстрый ввод-вывод выполняется путем вызова подпрограммы драйвера непосредственно с отдельными параметрами, а не с помощью стандартного механизма вызова IRP. Обратите внимание, что эти функции могут использоваться только для синхронного ввода-вывода и при кэшировании файла. Этот элемент используется только драйверами файловой системы (FSD) и драйверами сетевого транспорта.

DriverInit

Адрес точки входа для подпрограммы DriverEntry драйвера. Диспетчер ввода-вывода задает это поле для указания функции инициализации драйвера при загрузке драйвера. Это первая функция, вызываемая в драйвере при загрузке в память, и отвечает за инициализацию объекта драйвера и настройку подпрограмм отправки.

DriverStartIo

Точка входа для подпрограммы StartIo драйвера, если она есть, которая устанавливается подпрограммой DriverEntry при инициализации драйвера. Если драйвер не имеет подпрограммы StartIo , этот элемент имеет значение NULL.

DriverUnload

Точка входа для подпрограммы выгрузки драйвера, если она есть, которая устанавливается подпрограммой DriverEntry при инициализации драйвера. Если драйвер не имеет подпрограммы выгрузки , этот элемент имеет значение NULL.

MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]

Таблица отправки, состоящая из массива точек входа для подпрограмм DispatchXxx драйвера. Значения индекса массива — это значения IRP_MJ_XXXX, представляющие каждый основной код функции IRP. Эта основная таблица диспетчеризации функций должна быть последним полем объекта, чтобы он оставался расширяемым. Каждый драйвер должен задать точки входа в этом массиве для запросов IRP_MJ_XXXX , которые обрабатывает драйвер. Дополнительные сведения см. в разделе "Написание подпрограмм отправки".

Чтобы помочь анализу кода для драйверов, средства проверки статических драйверов (SDV) и других средств проверки, каждая подпрограмма DispatchXxx объявляется с помощью типа DRIVER_DISPATCH, как показано в этом примере кода:

DRIVER_DISPATCH DispatchXxx;

Затем подпрограмма обратного вызова реализуется следующим образом:

_Use_decl_annotations_
NTSTATUS
  DispatchXxx(
    struct _DEVICE_OBJECT  *DeviceObject,
    struct _IRP  *Irp
    )
  {
      // Function body
  }

Тип функции DRIVER_DISPATCH определен в файле заголовка Wdm.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте заметку _Use_decl_annotations_ в определение функции. Заметка _Use_decl_annotations_ гарантирует, что используются заметки, применяемые к типу функции DRIVER_DISPATCH в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в объявлении функций с помощью типов ролей функций для драйверов WDM. Сведения о _Use_decl_annotations_см. в поведению функции.

Замечания

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

Драйвер должен задать точки входа DispatchXxx в объекте драйвера, передаваемом в подпрограмму DriverEntry при загрузке драйвера. Драйвер устройства должен задать одну или несколько точек входа DispatchXxx для IRP_MJ_XXXX, для обработки любого драйвера одного типа устройства. Драйвер более высокого уровня должен задать одну или несколько точек входа DispatchXxx для всех IRP_MJ_XXXX, которые он должен передать базовому драйверу устройства. В противном случае драйвер не отправляет irPs для каких-либо IRP_MJ_XXXX, для которых он не настраивает подпрограмму DispatchXxx в объекте драйвера. Дополнительные сведения о наборе IRP_MJ_XXXX, необходимых для обработки драйверов для различных типов базовых устройств, см. в разделе "Основные коды функций IRP".

Подпрограмма DriverEntry также задает точки входа драйвера AddDevice, StartIo и/или Выгрузить точки входа, если таковые есть, в объекте драйвера.

Строка HardwareDatabase может использоваться драйверами устройств для получения сведений о конфигурации оборудования из реестра при загрузке драйвера. Драйвер получает доступ только для чтения к этой строке.

Входные данные RegistryPath для подпрограммы DriverEntry указывают на раздел \Registry\Machine\System\CurrentControlSet\Services\DriverName , где запись значения DriverName определяет драйвер. Этот раздел реестра содержит конфигурацию службы драйвера, включая такие значения, как:

  • Запуск: когда драйвер должен быть загружен (загрузка, система, автоматический, спрос или отключен)
  • Тип службы (драйвер ядра, драйвер файловой системы и т. д.)
  • ErrorControl: как система должна реагировать, если драйвер не загружается
  • ImagePath: путь к двоичному файлу драйвера

Драйверы могут хранить дополнительные данные конфигурации в подразделе "Параметры " ключа службы. Что касается HardwareDatabase в объекте входного драйвера, драйвер получает доступ только для чтения к этой строке.

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

Требования

Требование Ценность
Заголовок wdm.h (включите Wdm.h, Ntddk.h, Ntifs.h)

См. также

Вход драйвера

IoCreateDevice

IoDeleteDevice

StartIo

выгрузить