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


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

Каждый объект драйвера представляет образ загруженного драйвера в режиме ядра. Указатель на объект драйвера — это входной параметр драйвера 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

Определяет тип члена CSHORT.

Size

Определяет размер члена CSHORT.

DeviceObject

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

Flags

Определяет элемент ULONG флагов флагов.

DriverStart

Определяет член PVOIDDriverStart.

DriverSize

Определяет драйвер члена ULONG.

DriverSection

Определяет член PVOIDDriverSection.

DriverExtension

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

DriverName

Определяет элемент DriverName UNICODE_STRING.

HardwareDatabase

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

FastIoDispatch

Указатель на структуру, определяющую быстрые точки ввода-вывода драйвера. Этот элемент используется только 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 определяет драйвер. Что касается HardwareDatabase в объекте входного драйвера, драйвер получает доступ только для чтения к этой строке.

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

Требования

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

См. также

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

IoCreateDevice

IoDeleteDevice

StartIo

выгрузить