DLL CreateThread, DisableThreadLibraryCalls and _beginthread

DLL CreateThread, DisableThreadLibraryCalls and _beginthreadex

本文关键字:beginthread and DisableThreadLibraryCalls CreateThread DLL      更新时间:2023-10-16

我试图了解CreateThread_beginthreadex之间的区别,以及为什么调用DisableThreadLibraryCalls只会阻止安装_beginthreadex的线程执行。

我有一个项目,它是一个DLL,一个旧的DLL,这是一个win32 dll,我的任务是将其移植到win64。 让我绊倒的一件事是DLLMainDisableThreadLibraryCalls打电话。

我的线程是用_beginthreadex安装的,线程的主体从未被执行,因为调用DisableThreadLibraryCalls。 删除它后,线程工作正常。

现在我发现同一 DLL 中的其他线程都是以CreateThread开头的,然后我认为是调用DisableThreadLibraryCalls那里以防止这些线程执行,所以我把它放回去,发现用CreateThread创建的线程被执行,无论是否存在DisableThreadLibraryCalls,但用_beginthreadex创建的线程被禁用。

为什么? 我找不到任何内容:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682579(v=vs.85).aspx

这描述了为什么会发生这种情况。

CreateThread()是一个用于创建线程的 Windows 本机 API,而_beginthread()_beginthreadex()是 C 运行时库的一部分,旨在更轻松地管理线程创建,但它们仍然必须在内部调用CreateThread()

您自己的答案是错误的,因为 C 运行时中没有显式检查启用/禁用。

相反,C 运行时库使用DLL_THREAD_ATTACHDLL_THREAD_DETACH回调来管理线程本地存储,因此通过调用DisableThreadLibraryCalls()来禁用这些回调会阻止 C 运行时线程管理函数正常工作也就不足为奇了。

我在网上找到了参考资料,指出_beginthread_beginthreadex内部调用CreateThread所以也许检查禁用/启用状态仅在顶级例程中执行,这确实呼应了我的发现,对我来说,CreateThread中缺少逻辑。

DisableThreadLibaryCalls对直接使用CreateThread创建的线程没有影响。