Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 加载过程中如何处理位错误的DLL?_Winapi_Visual C++_Dll_32bit 64bit_Loadlibrary - Fatal编程技术网

Winapi 加载过程中如何处理位错误的DLL?

Winapi 加载过程中如何处理位错误的DLL?,winapi,visual-c++,dll,32bit-64bit,loadlibrary,Winapi,Visual C++,Dll,32bit 64bit,Loadlibrary,免责声明:我知道您不能加载错误位的DLL。这里的问题是当遇到一个人时会发生什么 当32位/64位Windows进程在加载DLL期间遇到模块的64位/32位DLL时会发生什么情况? 我所说的“发生了什么”是指NT DLL加载程序到底在执行什么舞蹈。 32->64位和64->32位之间有什么区别吗 注意:我认为答案应该与(本机)DLL是通过链接时间依赖项动态加载还是通过链接时间依赖项“静态”加载无关 我的测试: 场景0: 原则上容易-无法加载。 我的LoadLibrary调用集错误就是这种情况 情景

免责声明:我知道您不能加载错误位的DLL。这里的问题是当遇到一个人时会发生什么

当32位/64位Windows进程在加载DLL期间遇到模块的64位/32位DLL时会发生什么情况?

我所说的“发生了什么”是指NT DLL加载程序到底在执行什么舞蹈。

32->64位和64->32位之间有什么区别吗

注意:我认为答案应该与(本机)DLL是通过链接时间依赖项动态加载还是通过链接时间依赖项“静态”加载无关

我的测试:

场景0: 原则上容易-无法加载。 我的
LoadLibrary
调用集错误就是这种情况

情景1:

...\harry.exe ~ (a. 64 bit / b. 32 bit) 
...\sally.dll ~ (a. 32 bit / b. 64 bit)
  • 也就是说,DLL存在,但位不正确
这将(在a和b两种情况下)从
LoadLibrary
设置错误
error\u BAD\u EXE_FORMAT
/193。 现在它变得有趣了:

场景2.a:(反转b的比特数)

  • 也就是说,我们有两个版本的可执行文件和DLL。可执行文件可以找到正确位的DLL但是它将首先找到错误位的DLL
我的结果是:这很有效

在VS 2015调试器中运行时,我可以在本例中看到:

'harry.exe' (Win32): Loaded '...\x86\sally.dll'. Symbols loaded.
'harry.exe' (Win32): Unloaded '...\x86\sally.dll'
'harry.exe' (Win32): Loaded '...\x64\sally.dll'. Symbols loaded.
->成功

所以,双赢,只要能找到正确位的DLL就一定能找到

我在这里遇到的问题是:

  • 我和一位同事都认为这不起作用,也就是说,一旦Windows发现DLL的位不正确,它就会停止尝试。
    • 因此,情况一直如此吗
  • 显然,加载程序使用的是错误的位DLL——这种“探测”有任何副作用吗?(除了可能较慢的加载时间。)
  • 这是什么地方记录的?(必须爱MSDN:-)


测试说明:使用Visual Studio 2015在Win10/x64上对本文进行测试。Win7/x64上的结果是相同的。

一直都是这样吗?
-是。即使在2003年的x64(或xp x64)<代码>ZwMapViewOfSection返回
状态\图像\机器\类型\不匹配
以防32/64位不匹配。加载程序检查此代码,如果是,则继续搜索。只有当您的exe标记为NT 3.x及以下版本时,才会例外。范妮:这项检查(对于
MajorSubsystemVersion@RbMm)微软是否知道W2K源代码在github?o上。O@JonathanPotter-这个问题是微软提出的,但我想你知道。这种“探测”没有任何副作用,只是加载时间变慢了。
一直都是这样吗?
-是的。即使是在2003年的x64(或xp x64)中.ZwMapViewOfSection
返回
状态\u图像\u机器\u类型\u不匹配
以防32/64位不匹配。加载程序检查此代码,如果是,则继续搜索。仅当标记为NT 3.x及以下的exe例外。请确认此检查(对于
MajorSubsystemVersion@RbMm,Microsoft是否知道W2K源代码位于github?o上。O@JonathanPotter-这个问题不是问微软,而是想知道。这种“探测”没有任何副作用,只是加载速度较慢
set PATH=...\x86;...\x64;%PATH%
...\harry64.exe (depends on sally.dll in 64 bit)
...\x86\sally.dll
...\x64\sally.dll
'harry.exe' (Win32): Loaded '...\x86\sally.dll'. Symbols loaded.
'harry.exe' (Win32): Unloaded '...\x86\sally.dll'
'harry.exe' (Win32): Loaded '...\x64\sally.dll'. Symbols loaded.