从32位应用程序

时间:2016-05-12 21:30:21

标签: winapi windows-10

当像java或python这样的32位应用程序尝试打开c:\windows\system32\bash.exe时,根本找不到此文件。

然而,如果处理ir 64bit,它可以完美地工作。我创建了一个简单的C应用程序来检查它是如何工作的。

#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[]) {
char* path;
OFSTRUCT junk;

if (argc  != 2) {
 printf("provide path to file");
 return 1;
}
path = argv[1];
if( fopen( path, "r")) {
    printf("OK: Runtime reports file exists");
} else {
    printf("ERR: Runtime reports file does not exist");
}

printf("\n");
if (OpenFile(path, &junk,OF_EXIST) != HFILE_ERROR) {
    printf("OK: Win32API reports file exists");
} else {
    printf("ERR: Win32API reports file does not exist");
}

return 0;

}

编译时报告OK / OK,并在编译为x86时链接为x64和ERR / ERR。怎么会这样?是否有某种方法可以在Windows中“隐藏”32位应用程序中的文件?

1 个答案:

答案 0 :(得分:4)

这是行动中的file system redirector

  

在大多数情况下,只要32位应用程序尝试访问%windir%\ System32,就会将访问权限重定向到%windir%\ SysWOW64。

因此,您的32位应用程序正在寻找C:\Windows\SysWOW64\bash.exe,而这可能并不存在。

推荐的覆盖方式:

  

32位应用程序可以通过将%windir%\ Sysnative替换为%windir%\ System32来访问本机系统目录。 WOW64将Sysnative识别为一个特殊别名,用于指示文件系统不应重定向访问。

请注意,registry也有类似的重定向。