取消全局 CBT 挂钩后从所有进程卸载 DLL

2023-12-15

当加载 DLL 的系统范围挂钩被卸载时,如何从所有进程中正确卸载 DLL?

From MSDN:

您可以释放全局钩子 程序通过使用 取消挂钩WindowsHookEx,但这个功能 不释放包含以下内容的 DLL 钩子程序。这是因为全球 钩子过程被调用在 每个应用程序的进程上下文 在桌面上,导致隐式 调用 LoadLibrary 函数 所有这些过程。因为一个电话 FreeLibrary 函数不能 为另一个进程制作的,有 那么就没有办法释放DLL了。这 系统最终释放DLL 所有进程明确链接到 DLL 已终止或调用 FreeLibrary 和所有进程 调用的钩子程序已恢复 在 DLL 外部进行处理。

所以我正在寻找的是一种检测钩子何时脱钩的方法,然后调用FreeLibrary来自所有被挂钩的进程。有没有其他方法可以在卸载钩子时立即卸载 DLL?


Hook dll 在其消息循环中卸载。强制它们传入消息循环有助于卸载它们。

在 UnhookWindowsHookEx 之后添加以下内容以强制唤醒所有消息循环:

DWORD dwResult;
SendMessageTimeout(HWND_BROADCAST, WM_NULL, 0, 0, SMTO_ABORTIFHUNG|SMTO_NOTIMEOUTIFNOTHUNG, 1000, &dwResult);

但是我仍然时不时地遇到这个问题。我不知道它是从哪里来的。我认为锁定的进程可能会阻止 dll 卸载,但我没有证据证明这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

取消全局 CBT 挂钩后从所有进程卸载 DLL 的相关文章

随机推荐

  • 编译器和汇编器位于计算机的哪里?

    所以我知道最基本的知识 编译器将源代码转换为汇编代码 汇编器将汇编代码转换为机器代码 但我无法正确谷歌搜索 它们实际上位于哪里 我假设编译器位于硬盘驱动器上的某个位置 因为您可以从网络下载编译器并将它们用于各种编程语言 汇编器是位于硬盘上
  • python请求获取cookie

    x requests post url data data print x cookies 我使用requests库从网站获取一些cookie 但我只能获取cookie 从响应中 如何从请求中获取cookie 谢谢 或者 您可以使用requ
  • 如何动态设置 Rust 数组长度?

    我想创建这样的数组 let arr 0 length 其中长度是ausize 但我收到这个错误 E0307 The length of an array is part of its type For this reason this le
  • 由于打开相机时内存不足,phonegap Android 应用程序崩溃

    我正在使用 PhoneGap v1 3 0 开发 Android PhoneGap 应用程序我的应用程序有一个按钮 当单击该按钮时 使用phonegap api启动相机 当用户捕获图像时返回照片路径 但发生的情况是应用程序在相机返回之前崩溃
  • 使用httprequest下载文件

    是否可以使用 httprequest 从网站下载文件 我只习惯用它来获取页面的源代码 如果无法使用 httprequest 来完成此操作 是否可以使用 C 下载文件而无需使用网络浏览器 编辑 答案必须允许我选择硬盘上将文件下载到的位置 你绝
  • (PHP) 如何将 crypt() 与 CRYPT_BLOWFISH 一起使用?

    首先 我发现要使用 CRYPT BLOWFISH 我需要使用以 2a 开头的 16 字符盐 但是 那crypt 的 php net 文档说有些系统不支持CRYPT BLOWFISH 这种情况有多常见 接下来 从文档上的示例中 我看到我使用
  • 可以用相机测量到物体的距离吗?

    可以用手机摄像头测量到物体的距离吗 我的意思是 在我的应用程序中 我启动相机 将相机面对物体 比如说房子 然后按下按钮 它会计算距离并在屏幕上显示我 如果可能的话我可以在哪里找到一些教程或相关信息 我承认这个问题已经得到了充分的回答 明显需
  • 为什么两个浮动 div 之一被推到下一行?

    我有两个 div 我想将其放在一行中 第一个具有固定宽度 第二个没有设置宽度 如果我尝试将两者都设置为 float left 则第二个 div 将转到下一行 如果它包含太多单词 但如果第二个是非浮动的 它会与第一个 div 保持在同一行 为
  • jenkins字符串参数的字符串长度限制是多少

    现在我创建一个带有字符串参数的jenkins作业 该参数来自上游作业 我只是想知道字符串参数的长度是否有限制 因为此信息是从上游作业获取的 并且它是一个非常长的字符串 我相信没有人真正提供答案 因为没有理由限制底层技术 让我们看看 爪哇 J
  • 使用 Numpy 进行高效求和面积表计算

    我正在尝试计算面积求和表使用 python 和 numpy 构建特征计数矩阵 目前我正在使用以下代码 def summed area table img table np zeros like img astype int for row
  • 在 Node.js 中,如何“包含”其他文件中的函数?

    假设我有一个名为 app js 的文件 很简单 var express require express var app express createServer app set views dirname views app set vie
  • Material Design Lite - 文本字段中的底线与彩色线有轻微间隙

    我正在尝试让 Material Design Lite 文本字段正常工作 但遇到一个问题 底部彩色线与灰色起始线之间有轻微的 3 4 px 间隙 我插入页面的任何 MDL 文本字段示例都会得到相同的结果 什么可能在本地触发该问题 我还在前端
  • Django(使用 TokenAuthentication):“non_field_errors”:“无法使用提供的凭据登录?

    我正在使用 httpie 来测试我的自定义身份验证 http POST http 127 0 0 1 8000 api token auth username username1 password Password123 我确实使用创建了一
  • 从 gchar 缓冲区发送图像到 ftp 服务器 (libcurl)

    我正在开发一个用 C 编程的 Linux 应用程序 它处理 gdk pixbuf 图像 然后通过 ftp libcurl 将它们发送到远程服务器 图像保存到 gchar 缓冲区中gdk pixbuf save to buffer 问题是我不
  • Django 更新模型

    我有一个模型如下 class UserPrivacy models Model user models ForeignKey User profile models SmallIntegerField default 1 choices P
  • 使用 hooks 进行两次 React 渲染

    为什么我的组件渲染两次 export default function App console log asd const count setCount useState 0 return div div
  • 签出 origin/ 时如何知道我在 git 上的哪个分支

    我们有一个实际上可以做到的脚本git fetch git checkout origin
  • ShellExecute:动词“runas”不适用于路径中带有空格的批处理文件

    我正在使用 ShellExecuteW 启动批处理文件 代码看起来有点像这样 ShellExecuteW GetDesktopWindow wide verb c str wide filename c str wide parameter
  • 在C代码中表示EOF?

    换行符表示为 n 在C代码中 是否有与文件结束符 EOF 等效的字符 EOF 不是一个字符 在大多数现代操作系统中 它只是到达流末尾时应用于文件流的一个条件 之所以会出现混乱 是因为用户可能signalEOF 用于通过键入特殊字符进行控制台
  • 取消全局 CBT 挂钩后从所有进程卸载 DLL

    当加载 DLL 的系统范围挂钩被卸载时 如何从所有进程中正确卸载 DLL From MSDN 您可以释放全局钩子 程序通过使用 取消挂钩WindowsHookEx 但这个功能 不释放包含以下内容的 DLL 钩子程序 这是因为全球 钩子过程被