我的應用程序被編譯爲32位,並且由於我在64位Windows 7上運行,因此我的目標(notepad.exe)爲64位。當我在notepad.exe的第一個線程上調用SetWindowsHookEx()
時,DLL根本沒有被注入,但沒有返回錯誤。我知道它沒有被注入,因爲我在DLL_PROCESS_ATTACH
上顯示帶有消息Attached
的消息框,對於DLL_PROCESS_DETACH
,我在消息框中顯示Detached
消息。這些消息只會在我撥打LoadLibrary()
時顯示一次,另一次是我的應用程序退出時顯示。從32位進程掛鉤64位進程時,SetWindowsHookEx()不會返回錯誤?
根據MSDN文檔here:
因爲應用程序上下文中運行掛鉤,它們必須匹配 的應用程序的「位數」。如果32位應用程序在64位Windows上安裝了全局掛接,則將32位掛接注入到每個32位進程(通常的安全邊界適用)中。在64位 進程中,線程仍被標記爲「掛鉤」。但是,由於32位應用程序必須運行該鉤子代碼,系統將在鉤子應用程序的上下文中執行 掛鉤;具體來說,在 調用SetWindowsHookEx的線程上。這意味着掛鉤應用程序必須繼續泵送消息,否則可能會阻止64位進程的正常運行。
這是否意味着它成功掛鉤了我自己的進程而不是實際返回錯誤?
編輯:我的鉤子是WH_CBT類型。
這個問題關鍵取決於鉤子的類型 –
它沒有義務返回錯誤,它肯定會注入* some *進程。只是不是你想要的。這是64位操作系統上的缺陷,您需要使用64位DLL啓動64位版本的程序,以注入64位進程。 –