DRIVER_OBJECT结构(wdm.h)
每个驱动程序对象表示加载的内核模式驱动程序的图像。 指向驱动程序对象的指针是驱动程序的 DriverEntry、AddDevice的输入参数,以及可选的 重新初始化 例程及其 Unload 例程(如果有)。
驱动程序对象部分不透明。 驱动程序编写器必须了解驱动程序对象的某些成员,才能初始化驱动程序,并在驱动程序可卸载时卸载该驱动程序。 驱动程序对象的以下成员可供驱动程序访问。
语法
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
DriverStart定义 PVOID 成员。
DriverSize
定义 DriverSize ULONG 成员。
DriverSection
定义 PVOID 成员 DriverSection。
DriverExtension
指向驱动程序扩展的指针。 驱动程序扩展的唯一可访问成员是 DriverExtension->AddDevice,驱动程序的 DriverEntry 例程存储驱动程序的 AddDevice 例程。
DriverName
定义 driverName 成员 UNICODE_STRING 成员。
HardwareDatabase
指向注册表中硬件配置信息的 \Registry\Machine\Hardware 路径的指针。
FastIoDispatch
指向定义驱动程序快速 I/O 入口点的结构的指针。 此成员仅由 FSD 和网络传输驱动程序使用。
DriverInit
DriverEntry 例程的入口点,由 I/O 管理器设置。
DriverStartIo
驱动程序 StartIo 例程(如果有)的入口点,驱动程序初始化时由 DriverEntry 例程设置。 如果驱动程序没有 StartIo 例程,则此成员 NULL。
DriverUnload
驱动程序 Unload 例程(如果有)的入口点,驱动程序初始化时由 DriverEntry 例程设置。 如果驱动程序没有 Unload 例程,则此成员 NULL。
MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]
一个调度表,其中包含驱动程序 DispatchXxx 例程的入口点数组。 数组的索引值是表示每个 IRP 主函数代码IRP_MJ_XXX 值。 每个驱动程序必须在此数组中为驱动程序处理 IRP_MJ_XXX 请求设置入口点。 有关详细信息,请参阅 编写调度例程。
为了帮助 驱动程序代码分析,静态驱动程序验证程序(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 命名,以便系统自动加载驱动程序。 如果此例程的名称是其他名称,驱动程序编写器必须定义链接器初始化例程的名称;否则,系统加载程序或 I/O 管理器找不到驱动程序的传输地址。 可以由驱动程序编写者自行决定选择其他标准驱动程序例程的名称。
驱动程序必须在加载驱动程序时将其 DispatchXxx 入口点设置为传递到 DriverEntry 例程的驱动程序对象中。 设备驱动程序必须为 IRP_MJ_XXX 设置一个或多个 DispatchXxx 入口点, 需要处理同一类型的设备的任何驱动程序。 高级驱动程序必须为必须传递到基础设备驱动程序的所有 IRP_MJ_XXX 设置一个或多个 DispatchXxx 入口点。 否则,驱动程序不会为其在驱动程序对象中设置 DispatchXxx 例程的任何 IRP_MJ_XXX 发送 IRP。 有关需要处理不同类型的基础设备的驱动程序 IRP_MJ_XXX 集的详细信息,请参阅 IRP 主要函数代码。
DriverEntry 例程还设置驱动程序的 AddDevice、StartIo 和/或 Unload 入口点(如果有)。
设备驱动程序可以使用 HardwareDatabase 字符串在加载驱动程序时从注册表获取硬件配置信息。 为驱动程序提供对此字符串的只读访问权限。
RegistryPathDriverEntry 例程的输入指向 \Registry\Machine\System\CurrentControlSet\Services\DriverName 键,其中 DriverName 的值项标识驱动程序。 至于输入驱动程序对象中的 HardwareDatabase,将为驱动程序提供对此字符串的只读访问权限。
驱动程序对象中的未记录成员应被视为不可访问。 依赖于对象成员位置或访问未记录成员的驱动程序可能无法在一段时间内保持可移植性且与其他驱动程序互作。
要求
要求 | 价值 |
---|---|
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |