我得到了两个 DRIVER_OBJECT 实例。我在从注册表获得的驱动程序名称上使用 ObReferenceObjectByName() 来获取一个 DRIVER_OBJECT。我从 DEVICE_OBJECT 结构中获得的第二个。我想检查两个 DRIVER_OBJECT 是否相等,以了解我从注册表读取的驱动程序是否与为该设备加载的驱动程序相同。
问问题
347 次
2 回答
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 都没有记录,应该避免。
希望这可以帮助。
于 2013-08-16T08:25:43.870 回答
-1
好吧,我遇到了一个非常简单而优雅的解决方案,我想分享一下。指向 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.
}
于 2013-08-19T06:05:16.493 回答