我得到了兩個DRIVER_OBJECT實例。我使用從註冊表獲取的驅動程序名稱上的ObReferenceObjectByName()來獲取一個DRIVER_OBJECT。第二我從DEVICE_OBJECT結構中獲得。我想檢查兩個DRIVER_OBJECT是否相等,以便了解從註冊表讀取的驅動程序是否與爲該設備加載的驅動程序相同。比較兩個DRIVER_OBJECT是否相等?
1
A
回答
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.
}
相關問題
- 1. 比較兩次公差是否相等?
- 2. 比較兩組是否相等遞歸?
- 3. 比較三個值是否相等
- 4. 比較兩個圖像是否相同
- 5. 如何比較模板中的兩個typedesc是否相等
- 6. 比較兩個HashMaps關鍵字是否相等?
- 7. 比較在vb.net兩個日期它們是否相等或不
- 8. 如何比較兩個意圖是否相等
- 9. 斷言語句比較兩個文件是否相等
- 10. 如何比較兩個張量在特徵中是否相等?
- 11. 比較兩個numpy數組是否相等,元素方式
- 12. 比較兩個(非STL)地圖是否相等
- 13. 比較兩個圖像是否相等(跨域)
- 14. 比較兩個不同陣列中的值是否相等
- 15. 比較兩個整數對象是否相等,無論類型
- 16. CompareMem適合比較兩個數組是否相等?
- 17. 如何比較C++中的兩個ostream對象是否相等?
- 18. 比較兩個字符串是否相等
- 19. 如何使用Javascript比較兩個數組是否相等?
- 20. 比較兩個散列的哈希值是否相等
- 21. 如何比較兩個或更多List(Integer)是否相等?
- 22. 如何比較兩個邏輯表達式是否相等?
- 23. String比較null和empty是否相等
- 24. 比較uuids是否相等(在php中)
- 25. 比較字符串是否相等
- 26. 如果比較兩個序列相等
- 27. 比較Where子句中兩列是否相等
- 28. 比較兩個相同類型的對象是否相等,沒有公共getters?
- 29. 如何比較一個循環中兩個列表的值是否相等?
- 30. 比較兩個等價類