比较两个DRIVER_OBJECT是否相等?

时间:2013-08-16 04:56:57

标签: c++ c windows kernel driver

我得到两个DRIVER_OBJECT实例。我在从注册表获取的驱动程序名称上使用ObReferenceObjectByName()来获取一个DRIVER_OBJECT。我从DEVICE_OBJECT结构得到的第二个。我想检查两个DRIVER_OBJECT是否相等,以便了解我从注册表中读取的驱动程序是否与为该设备加载的驱动程序相同。

2 个答案:

答案 0 :(得分:1)

警告

这个答案可能不是最准确的,我只是在许多年前的凌晨写下的旧记忆:

如果有人知道的更好而且我犯了一个错误,请在下面给我留言,我会解决。

声明

ObReferenceObjectByName没有文档且存在风险,您不应该在不了解限制的情况下使用它(例如,它将在Windows 7下失败)。

答案

DRIVER OBJECT是:

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都是未记录的,应该避免使用。

希望这有帮助。

答案 1 :(得分:-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.
}