DWORD baseAddress = (DWORD) GetModuleHandle(NULL);
如果我將該代碼放入一個DLL並將其注入到一個進程中,這似乎等於注入進程的基址。爲什麼使用GetModuleHandle獲取基地址?
這是如何工作的?從HMODULE轉換到DWORD如何工作?如果我將它丟棄而不是DWORD,它會起作用嗎?
DWORD baseAddress = (DWORD) GetModuleHandle(NULL);
如果我將該代碼放入一個DLL並將其注入到一個進程中,這似乎等於注入進程的基址。爲什麼使用GetModuleHandle獲取基地址?
這是如何工作的?從HMODULE轉換到DWORD如何工作?如果我將它丟棄而不是DWORD,它會起作用嗎?
這是32位和64位版本Windows的實現細節。 HMODULE比這個更早,在16位版本的Windows中它們是真正的句柄。這在win32中不是必需的,模塊加載的虛擬內存地址唯一地標識了模塊。所以使用虛擬機地址更好,不需要把它保存在句柄表中。
這確實意味着您不能轉換爲DWORD,不足以在64位版本上存儲虛擬內存地址。你需要使用DWORD_PTR。
它的工作原理是因爲Windows恰巧使用基地址作爲識別句柄,並且因爲在32位系統上地址適合DWORD。由於Windows不需要這樣做,所以不應該依賴它。
在64位計算機上,這不起作用,因爲DWORD是32位。但是'HMODULE'只是一個'void *'指針。 –
爲什麼有downvotes的任何理由? – user2654180
這只是SO的C++社區的非正式問候:) – greatwolf