问题标签 [dllmain]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1990 浏览

c++ - 何时将使用 DLL_PROCESS_VERIFIER 标志调用 DllMain?

在 Windows 上,标准 DLL 入口点称为 DllMain。第二个参数是一个 DWORD ul_reason_for_call,.

我在 MSDN 上查找了第二个参数的可能值。以下是显而易见的:

但是关于:

何时使用此标志调用入口点?我应该在 DLL 的“正常”操作期间担心它吗?

请注意,我只DLL_PROCESS_VERIFIER在 Visual Studio 2005 的头文件中看到,而不是 2008。

0 投票
1 回答
350 浏览

c++ - 查询Dll布局信息

我想从内存中的 DLL 中查询以下信息:

  • 入口点的确切地址(DllMain?!)
  • Dll代码段的地址和大小
  • 每个 EXPORTED 函数的入口点地址

我使用GetModuleInformation()了从 PSAPI 函数来查询入口点。但根据 MSDN “这不是DllMain函数的地址”。

是否有任何库/API 可以查询这些信息?

我需要一种通用的方法来查询这些信息,它不依赖于硬编码的字符串或其他东西。

0 投票
1 回答
179 浏览

c++ - 为什么从 DllMain 调用 WSASocket 会导致挂起?

当我的 DLL 被卸载时,我需要销毁一些对象。该对象包含一个有时调用 WSASocket 函数(用于重新连接连接)的线程。因此,我从 DllMain 调用析构函数以响应DLL_PROCESS_DETACH,但这会导致我的应用程序挂起。具体来说,对 WSASocket 的调用被锁定。

我知道有些函数不能从 DllMain 调用,尤其是调用 LoadLibrary 和 FreeLibrary 的函数。但是为什么 WSASocket 函数会出现同样的问题呢?

0 投票
1 回答
3942 浏览

c++ - 注入后未执行 DLLMain()

我用 C++ 编写了一个 dll 和注入器。dll代码如下:

dll 将特定文件上传到服务器。我能够使用 LoadLibrary() 和 CreateRemoteThread() 成功地将 dll 注入“notepad.exe”,但它没有被执行。甚至没有 dllmain() 函数。不知道怎么回事。

0 投票
0 回答
126 浏览

python - 为什么 dllMain 会覆盖我的 FPU 的控制字?

我在这里这里看到dllMain改变了我的 FPU 的控制字,我需要:

所以它会恢复正常。但没有人说明为什么这样做。

有谁知道为什么我的 dllMain 会这样做?在什么编译器上?只有视觉工作室?为什么微软决定在我不知道我的每个 dll 的情况下设置我的 FPU 控制字是个好主意?有没有办法改变这种行为?

0 投票
1 回答
707 浏览

windows - 从 DllMain 加载/调用 ntdll

不应使用DllMain中kernel32.dll中的函数以外的函数:

来自 MS 文档:

因为当调用入口点函数时,Kernel32.dll 保证被加载到进程地址空间中,所以在 Kernel32.dll 中调用函数不会导致 DLL 在其初始化代码执行之前被使用。因此,入口点函数可以调用 Kernel32.dll 中不加载其他 DLL 的函数。例如,DllMain 可以创建临界区和互斥锁等同步对象,并使用 TLS。不幸的是,Kernel32.dll 中没有安全函数的完整列表。
...
调用需要除 Kernel32.dll 之外的 DLL 的函数可能会导致难以诊断的问题。例如,调用 User、Shell 和 COM 函数可能会导致访问冲突错误,因为某些函数会加载其他系统组件。相反,在终止期间调用诸如此类的函数可能会导致访问冲突错误,因为相应的组件可能已经被卸载或未初始化。

我的问题:
但是文档没有提到ntdll.dll。- 我可以为“ntdll”调用LoadLibrary并在DllMain中使用ntdll中的函数: 1) 在DLL_PROCESS_ATTACH期间(加载和使用 ntdll 的函数)? 2) 在DLL_PROCESS_DETACH期间(使用之前加载的 ntdll 的函数)?


另外,请拥有 1500+ 声誉的人愿意创建一个名为“dllmain”的新标签吗?

0 投票
3 回答
1193 浏览

c - 在 DllMain() 之前调用了哪些函数?

在 DllMain() 之前调用了哪些函数?如果在 C 运行时初始化期间不止一个,那么顺序很重要。

0 投票
2 回答
1975 浏览

c++ - apientry dllmain 出错

我尝试在 Borland c++ 5.02 中创建 *.dll 文件,我对这个函数有疑问

我尝试编译我的项目,但编译器显示错误。这个函数有什么问题,或者这个编译器与另一个编译器有不同的类型风格吗?

0 投票
1 回答
5225 浏览

dll - 没有从注入的 dll 调用 DllMain

我正在尝试使用 LoadLibrary 和 CreateRemoteThread 方法将 dll 注入现有进程。除了由于某种原因没有调用 DllMain 之外,我所有的代码都运行良好。

我已经绞尽脑汁做了尽可能多的互联网研究,但这些建议都没有帮助。

当我将 dll 静态加载到示例项目中时,它运行良好。

当我使用 LoadLibrary 将 dll 动态加载到示例项目中时,它运行良好。

唯一一次不调用 DllMain 是当我尝试使用 LoadLibrary 和 CreateRemoteThread 方法将其注入进程时。我无计可施!

我已验证 dll 已从注入器加载到 notepad.exe 进程中,因为 SimpleDLL.dll 文件已被锁定,在我关闭 notepad.exe 之前无法删除或覆盖。

仅供参考,我的想法是 Microsoft Visual Studio 2010 Ultimate。

.

SimpleDLLCaller.cpp - 它运行正确并打印出来自 DllMain 的消息。这是我构建的一个项目,用于验证 dll 是否正确构建。从我可以看到的输出中,以这种方式加载时它似乎运行正常。

SimpleDllCaller 的输出:

Simple Injector.cpp - 这是一个独立于 SimpleDLLCaller 的项目,可以成功编译/运行而不会出现警告(只要 notepad.exe 已经在运行),但不会显示来自 DllMain 的消息。

简单注射器的输出:

请告诉我我在这里做错了什么。欢迎任何反馈。

0 投票
1 回答
865 浏览

winapi - DllMain DLL_PROCESS_DETACH 和 GetMessage 函数重入

我编写了一个全局挂钩,它使用SetWindowsHookEx挂钩WH_GETMESSAGE、WH_CALLWNDPROC 和 WH_CALLWNDPROCRET。
钩子 dll 在钩子进程中创建一个新线程,除其他外,该线程检查进程的音频状态并调用IAudioSessionManager2::GetSessionEnumerator()

现在有趣的部分是,我从钩子主机调用了UnhookWindowsHookEx()并且在我的 dll 的工作线程运行对IAudioSessionManager2::GetSessionEnumerator()的调用期间。该调用位于同一个线程的调用堆栈中,其中调用了带有 DLL_PROCESS_DETACH 的 DllMain。我认为原因是GetSessionEnumerator()在某处调用GetMessage()函数,而后者是可重入的。不幸的是,我记不清了,但我想我在调用堆栈中看到了。

但是有很多重要的事情我想知道并且仍然不清楚。所以这里有我的相关问题:

  1. 是否可以随时调用带有 DLL_PROCESS_DETACH 的 DllMain,即使是在运行当前正在卸载的 dll 中的函数的线程中?
  2. 当 DllMain DLL_PROCESS_DETACH 退出时,堆栈上的函数会发生什么?调用堆栈上的函数中的代码最终会执行吗?
  3. 如果这些功能不退出怎么办?dll什么时候卸载?
  4. DllMain DLL_PROCESS_DETACH 是否可以在 WH_GETMESSAGE、WH_CALLWNDPROC 和 WH_CALLWNDPROCRET 挂钩的回调期间被类似地调用?我知道并且已经通过实验证实,有时,虽然不是太频繁,但这些函数是可重入的,所以对这些函数的调用可以在上一次调用仍在同一个堆栈中运行的时间内注入,但我不知道是否也调用DllMain 可以以类似的方式注入。
  5. 何时可以在线程中准确调用 DllMain - 是否有一些特定的 Windows API 函数需要调用,而这又可能导致 DllMain DLL_PROCESS_DETACH 调用,或者它可能发生在任何指令中?
  6. 如果 DllMain DLL_PROCESS_DETACH 调用可以随时“注入”并且调用堆栈上的函数不再执行,那么我如何知道调用堆栈上的函数在哪里被中断?所以我可以在 DllMain 内部释放一些由函数在堆栈上分配的句柄或资源。
  7. 有什么方法可以暂时阻止/推迟对 DllMain DLL_PROCESS_DETACH 的调用?如果调用/中断发生在同一个堆栈中,锁显然没有帮助。

不幸的是,我可能无法通过实验解决这些问题,因为我已经在多台计算机上运行了几个月的挂钩(以及取消挂钩)代码,然后在取消挂钩期间发生 DllMain 的这种情况。尽管由于某种原因,它同时出现了四个不同的程序......


另外请有足够声誉的人喜欢合并标签“reentrant”和“reentrancy”吗?