UnhookWindowsHookEx是否从钩子应用程序中卸载了一个特定于线程的钩子?

时间:2015-07-06 19:12:46

标签: c++ winapi hook

假设我有一个Windows挂钩程序,我使用SetWindowsHookEx在特定线程上安装。当我随后调用UnhookWindowsHookEx时,我的DLL是否包含从目标应用程序中卸载的钩子程序?

我在这个主题上找到的大多数documentation似乎暗示调用SetWindowsHookEx会导致在目标应用程序中隐式调用LoadLibrary。此外,文档还非常谨慎地指出,在全局 Windows挂钩上调用UnhookWindowsHookEx并不会从可能已加载它的所有进程中隐式释放库,但是不会在特定于线程的钩子的主题。我要么不仔细阅读文档,要么我的网络搜索能力让我失望。

2 个答案:

答案 0 :(得分:1)

特定于线程的钩子和全局钩子之间没有区别。线程ID参数只是一个过滤器,它决定了钩子的应用位置 - 它不会改变钩子规则。

因此,线程ID参数适用于不同的进程,并且适用与全局情况相同的规则 - 您无法安全地将FreeLibrary调用注入另一个进程,或者线程ID是您的一部分进程,没有理由调用LoadLibary,因为在调用SetWindowsHookEx之前已经加载了DLL。 (或者你为实例传递NULL,在这种情况下没有DLL)

我怀疑文档是使用“全局”来表示进程和“线程”正在进行中,因为这将是正常情况。挂钩另一个进程的单个线程将是一个罕见的事件(但似乎得到支持。请参阅remarks。)'

这当然只是在文档的各行之间阅读。

答案 1 :(得分:0)

根据我的研究,UnhookWindowsHookEx不会卸载.dll。收到新消息后,将由消息处理代码将其卸载。因此,一些几乎从未收到任何消息的后台进程,仍可能在删除钩子后很长时间就锁定了库。广播WM_NULL消息通常会有所帮助。我喜欢在摘钩后发送几次。

SendNotifyMessage(HWND_BROADCAST, WM_NULL, 0, 0);