我有一个旧的 32 位安装程序,它将一些 32 位依赖 DLL 安装到 Windows 系统文件夹中。我发现它无法在 64 位系统上安装一些 32 位 DLL,因为 SysWOW 重定向正在做一些我不理解的事情。
安装程序依赖于 Windows API 函数 GetFileVersionInfo 来指示 DLL 是否已经存在更新版本号。但是,我现在看到文件 MSVCR100.DLL 已经存在于 System32 文件夹中,但不在 SysWOW64 文件夹中的情况。当 GetFileVersionInfo 用于测试 C:\Windows\System32\MSVCR100.DLL 时,我希望它重定向到 C:\Windows\SysWOW64\MSVCR100.DLL。似乎如果 SysWOW64 中不存在该文件,那么它会在 System32 中查找作为后备。因此,安装程序认为 MSVCR100.DLL 已经存在并且无法安装它。
我创建了一个 C++ Win32 控制台应用程序来测试它。整个代码是:
int _tmain(int argc, _TCHAR* argv[])
{
char sysDirName[64], sysWow64DirName[64];
char fileName[256];
strcpy_s(fileName, argv[1]);
GetSystemDirectory((LPSTR)sysDirName, 256);
GetSystemWow64Directory((LPSTR)sysWow64DirName, 256);
test_file(sysDirName, fileName);
test_file(sysWow64DirName, fileName);
return 0;
}
void test_file(char *dir, char* fileName)
{
char filePath[256];
DWORD verInfoSize, tempDWORD;
BOOL found;
byte buff[8192];
PathCombine((LPSTR)filePath, (LPSTR)dir, (LPSTR)fileName);
verInfoSize = GetFileVersionInfoSize((LPSTR)filePath, &tempDWORD);
found = GetFileVersionInfo((LPSTR)filePath, 0, verInfoSize, buff);
if (found)
printf("%s --found\n", filePath);
else
printf("%s --NOT found\n", filePath);
}
我在 3 台不同的 64 位计算机上进行了测试,包括 Win 10、Win 7,我得到了相同的结果。
如果 MSVCR100.DLL 在 SysWOW64 但不在 System32 中,那么我的测试显示重定向按预期工作:
>testSysFile msvcr100.dll
C:\WINDOWS\system32\msvcr100.dll --found
C:\WINDOWS\SysWOW64\msvcr100.dll --found
如果 MSVCR100.DLL 既不在 System32 也不在 SysWOW64 中,则预期结果:
>testSysFile msvcr100.dll
C:\WINDOWS\system32\msvcr100.dll --NOT found
C:\WINDOWS\SysWOW64\msvcr100.dll --NOT found
如果 MSVCR100.DLL 在 System32 但不在 SysWOW64 中,则结果会显示一些意外且无用的内容:
>testSysFile msvcr100.dll
C:\WINDOWS\system32\msvcr100.dll --found
C:\WINDOWS\SysWOW64\msvcr100.dll --NOT found
网络搜索向我展示了许多有关 SysWOW 重定向的信息,但我找不到任何有关此行为的文档或讨论。这真的是我应该期待的吗?我的测试还表明,如果我使用 API 函数 GetSystemWow64Directory,我可以拥有一个不依赖重定向的文件路径。只复制 DLL 并在该路径上注册它们是否安全?