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