2013-08-16 98 views
1

我得到了兩個DRIVER_OBJECT實例。我使用從註冊表獲取的驅動程序名稱上的ObReferenceObjectByName()來獲取一個DRIVER_OBJECT。第二我從DEVICE_OBJECT結構中獲得。我想檢查兩個DRIVER_OBJECT是否相等,以便了解從註冊表讀取的驅動程序是否與爲該設備加載的驅動程序相同。比較兩個DRIVER_OBJECT是否相等?

回答

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都沒有記錄,應該避免。

希望這會有所幫助。

-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. 
}