【问题标题】:To compare two DRIVER_OBJECT for equality?比较两个 DRIVER_OBJECT 是否相等?
【发布时间】:2013-08-18 10:24:22
【问题描述】:
我得到了两个 DRIVER_OBJECT 实例。我在从注册表获得的驱动程序名称上使用 ObReferenceObjectByName() 来获取一个 DRIVER_OBJECT。我从 DEVICE_OBJECT 结构中获得的第二个。我想检查两个 DRIVER_OBJECT 是否相等,以了解我从注册表中读取的驱动程序是否与为该设备加载的驱动程序相同。
【问题讨论】:
标签:
c++
c
windows
kernel
driver
【解决方案1】:
警告
这个答案可能不是最准确的,我只是通过多年前凌晨写的钩子的旧记忆:
如果有人知道得更好,但我犯了一个错误,请在下面给我留言,我会改正的。
免责声明
ObReferenceObjectByName 未记录且存在风险,您不应在不了解限制的情况下使用它(例如,它在 Windows 7 下会失败)。
回答
驱动对象是:
typedef struct
{
SHORT Type;
SHORT 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;
LONG * DriverInit;
PVOID DriverStartIo;
PVOID DriverUnload;
LONG * MajorFunction[28];
} DRIVER_OBJECT;
比较 DriverStart(长度由 DriverSize 指定),看看它们是否映射到相同的内存地址,看看你是否到达任何地方。
但是,如果您想保持兼容,我认为您最好查看每个对象中的 DriverInit、DriverStartIo 和 DriverUnload 是否指向相同的地址。 DriverSection / DriverSize / DriverStart 均未记录,应避免使用。
希望这会有所帮助。
【解决方案2】:
好吧,我遇到了一个非常简单而优雅的解决方案,我想分享一下。指向 DRIVER_OBJECT 的指针(即 DRIVER_OBJECT 的地址)是一个十六进制数。而且由于一个驱动程序只有一个 DRIVER_OBJECT,因此比较此地址(十六进制数)是否相等会很有帮助。
PDRIVER_OBJECT a;
PDRIVER_OBJECT b;
/* get the values of a and b
...
...
*/
if (a == b)
{
// they point to the same DRIVER_OBJECT.
}