GetStringType如何在Dll Main中导致死锁?

问题描述 投票:0回答:1

我正在查看一个挂在Server 2016上但在Server 2008 R2上运行find的应用程序。我已将其追溯到由特定DLL加载时死锁引起的挂起。分析DLL(我没有源代码),可以看到它违反了准则here

  • 调用GetStringTypeA,GetStringTypeEx或GetStringTypeW(或者直接或间接)。这可能导致死锁或崩溃

特别是它从DllMain调用GetStringTypeW。

我试图了解此功能如何导致DllMain中的死锁。

windows winapi deadlock
1个回答
0
投票

您的DllMain函数在加载程序锁中运行,这是少数几个操作系统允许您运行代码而其内部锁定之一是保持。这意味着您必须格外小心,不要违反锁DllMain中的层次结构;否则,您将陷入僵局。 (请参阅“ Another reason not to do anything scary in your DllMain: Inadvertent deadlock”)

在保持加载程序锁定的同时调用[DllMain,因此,如果GetStringType获得了加载程序锁定,则会出现死锁。

对可以在DllMain中调用。因此,DllMain设计为执行最小初始化任务,通过使用一小部分Microsoft®Windows®API。 您不能直接在DllMain中调用任何函数或间接尝试获取加载程序锁。否则,您将引入您的应用程序死锁或崩溃的可能性。

我们看不到GetStringType函数的源代码。建议遵循GetStringType

© www.soinside.com 2019 - 2024. All rights reserved.