Windows驱动重要数据结构

Windows驱动重要数据结构

驱动对象

每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管

理程序所创建的。

驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并且内核对一个驱动只加载一个实例。确切地说,是由内核中的I/O管理器负责加载的。驱动程序需要在DriverEntry中初始化。先了解一下驱动对象的数据结构:

cpp 复制代码
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; 
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;

重要字段解释:

  • DeviceObject:每个驱动程序会有一个或多个设备对象。其中,每个设备对象都有一个指针指向下一个驱动对象,最后一个设备对象指向空。此处的DeviceObject指向驱动对象的第一个设备对象。通过 DeviceObject,就可以遍历驱动对象里的所有设备对象。设备对象是由程序员自己创建的,而非操作系统完成,在驱动被卸载的时候,遍历每个设备对象,并将其删除。
  • DriverName:顾名思义,PriveName记录的是驱动程序的名字。这里用UNICODE字符串记录,该字符串一般为**\Driver驱动程序名称**。
  • HardwareDatabase:这里记录的是设备的硬件数据库键名,这里同样用UNICODE字符串记录。该字符串一般为\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM。
  • DriverStartIo:记录StartIO例程的函数地址,用于串行化操作。
  • DriverUnload:指定驱动卸载时所用的回调函数地址。
  • MajorFunction:MajorFunction域记录的是一个函数指针数组,也就是MajorFunction是一个数组,数组中的每个成员记录着一个指针,每一个指针指向的是一个函数。这个函数就是处理IRP的派遣函数。
  • FastIoDispatch:文件驱动中用到的派遣函数

设备对象

每个驱动程序会创建一个或多个设备对象,用DEVICE_OBJECT数据结构表示。每个设备对象都会有一个指针指向下一个设备对象,因此就形成一个设备链。设备链的第一个设备是由上一节介绍的DRIVER_OBJECT结构体中指明的。设备对象保存设备特征和状态的信息,其数据结构定义如下:

cpp 复制代码
typedef struct _DEVICE_OBJECT { 
  ... 
 struct _DRIVER_OBJECT *DriverObject; 
 struct _DEVICE_OBJECT *NextDevice; 
 struct _DEVICE_OBJECT *AttachedDevice; 
struct _IRP *CurrentIrp; 
ULONG Flags; 
 struct _DEVOBJ_EXTENSION *DeviceObjectExtension; 
... 
} DEVICE_OBJECT; 
typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT; // ntndis
相关推荐
阿昭L3 天前
记一次符号类型不一致导致的链接错误
windows内核
阿昭L11 天前
Windows对象句柄回调 (Object Handle Callbacks)
windows内核
阿昭L2 个月前
Windows内核事件通知机制
windows·windows内核
阿昭L2 个月前
通过KiSystemServiceUser获取SSDT基址
逆向工程·windows内核·ssdt
阿昭L2 个月前
Windows键盘过滤
windows·驱动开发·windows内核·过滤驱动
阿昭L2 个月前
通过cr3读写进程内存
保护模式·windows内核
阿昭L2 个月前
调试CreateProcess
windows·进程·逆向工程·windows内核
阿昭L3 个月前
调试Windows11启动过程
windows·uefi·windows内核
LittleFishC4 个月前
08_长调用与短调用
c语言·汇编·逆向·windows内核
阿昭L4 个月前
NT驱动程序和WDM驱动程序
驱动开发·windows内核