dynamic链接到一个.exe而不是.dll导致崩溃在Windows 10上

问题

这是真的,当一个应用程序链接到一个.exe(或依赖于.exe的.dll),这个应用程序将崩溃在Windows 10?

长话短说

我问这个问题,因为前几天我有一个应用程序,有一些意想不到的崩溃在Windows 10.经过一些调查RbMm给了我一些很好的解释和可复制的例子调用静态链接function崩溃每次在Windows 8/10而不是7 。 它可以让我解决我的问题,但我不能相信会有这么一个巨大的重大突破,我找不到任何有关这个问题的文章

细节

RbMm发现的结论是:

然而,在Windows 10崩溃的根源 – 因为如果这个PE没有标志IMAGE_FILE_DLL,Windows 10不parsingPE(“exe”)导入。 换句话说,它处理这个PE,像LoadLibraryEx,标志为DONT_RESOLVE_DLL_REFERENCES – 不加载指定模块引用的附加可执行模块,也不parsing导入。 结果这个PE没有初始化,并会在第一次导入函数调用(在你的情况这是strcmp)崩溃。

例子

有一个简单的方法来重现这个问题:

#include <windows.h> #include <Netsh.h> #pragma comment(lib, "Netsh.lib") void main(int argc, char* argv[]) { MatchToken(L"*", L"*");// crash here on win 10 } 

我也创build了一个简单的项目 ,以伎俩。 它使用导出的函数生成一个.exe文件。 而另一个.exe使用这个导出的函数。

结论

那么我应该得出结论,许多项目现在不稳定在Windows 10或我错过了一些观点? (我确定,我做过)。

编辑

  • 我从不说这是一个好的做法,我只是使用已经这样做的程序,包括一些Microsoft库(Netsh,wshelper等)和一些有用的项目(postgresql)。

在这种情况下,您可以通过以下方式与图书馆通话:

 if (HMODULE hmod = LoadLibraryW(L"wshelper.dll")) { DWORD (WINAPI * InitHelperDll)(_In_ DWORD dwNetshVersion, PVOID pReserved); if (*(void**)&InitHelperDll = GetProcAddress(hmod, "InitHelperDll")) { InitHelperDll(1, 0);// crash here, internally InitHelperDll call the RegisterHelper function from Netsh.exe. //but again, because Netsh.exe not initialized (import not resolved) when it loads as DLL in win 10 } FreeLibrary(hmod); } 
  • 在Windows 7上,当从链接的.exedebuggingfunction工作正常。 所以我猜IAT是初始化的。 它也使用strcmp,所以CRT被初始化。

这是违反规范的行为? 未指定? 或者只是运气? 我应该打开微软服务台的票吗? 我应该打开使用此行为的每个项目的票证。 或者是以编程方式初始化Windows 10上的IAT和CRT(不需要修改导出函数的.exe)的正确方法?