Winapi 加载过程中如何处理位错误的DLL?
免责声明:我知道您不能加载错误位的DLL。这里的问题是当遇到一个人时会发生什么 当32位/64位Windows进程在加载DLL期间遇到模块的64位/32位DLL时会发生什么情况? 我所说的“发生了什么”是指NT DLL加载程序到底在执行什么舞蹈。 32->64位和64->32位之间有什么区别吗 注意:我认为答案应该与(本机)DLL是通过链接时间依赖项动态加载还是通过链接时间依赖项“静态”加载无关 我的测试: 场景0: 原则上容易-无法加载。 我的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调用集错误就是这种情况 情景
LoadLibrary
调用集错误就是这种情况
情景1:
...\harry.exe ~ (a. 64 bit / b. 32 bit)
...\sally.dll ~ (a. 32 bit / b. 64 bit)
- 也就是说,DLL存在,但位不正确
LoadLibrary
设置错误error\u BAD\u EXE_FORMAT
/193。
现在它变得有趣了:
场景2.a:(反转b的比特数)
- 也就是说,我们有两个版本的可执行文件和DLL。可执行文件可以找到正确位的DLL但是它将首先找到错误位的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.
->成功
所以,双赢,只要能找到正确位的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.