Wow64DisableWow64FsRedirection on 32-bit Windows XP
Wow64DisableWow64FsRedirection on 32-bit Windows XP
我正在用Visual Studio c++编写一个程序,该程序需要在任何运行Windows XP 32位或任何后续Windows操作系统的计算机上作为32位进程运行。该程序需要能够访问计算机上的C:Windowssystem32
文件夹,而不管该程序是在64位还是32位系统上运行。为此,我使用Wow64DisableWow64FsRedirection
禁用Windows通常对32位进程进行的重定向,将它们发送到C:Windowssyswow64
。不幸的是,这破坏了兼容性——尽管我的程序可以在Server 2003和XP x64版本上运行,但只要它在32位XP RTM系统上运行,程序就会失败,给我这个错误:
[Program Name] - Entry Point Not Found
The procedure entry point Wow64DisableWow64FsRedirection could not be located
in the dynamic link library KERNEL32.dll.
由于系统是32位,调用显然是多余的,但我无法找出一种方法来确定在运行时系统是否是64位,因此是否跳过调用,而不添加另一个调用本身破坏兼容性,如IsWow64Process()
,这需要XP Service Pack 2。
tl;dr:如何在不使用64位Windows问世后引入的任何调用的情况下确定系统是64位还是32位?
继续使用Wow64DisableWow64FsRedirection
,但不要静态导入它。相反,可以使用动态绑定(GetProcAddress
)或延迟加载,这两种方法都允许您处理丢失的函数而不会崩溃(或者更糟,甚至不会启动,这是当前的情况)。
不要担心系统的比特。如果函数存在,调用它。
typedef BOOL WINAPI fntype_Wow64DisableWow64FsRedirection(PVOID *OldValue);
auto pfnWow64DisableWow64FsRedirection = (fntype_Wow64DisableWow64FsRedirection*)GetProcAddress(GetModuleHandleA("kernel32.dll"), "Wow64DisableWow64FsRedirection");
if (pfnWow64DisableWow64FsRedirection) {
// function found, call it via pointer
PVOID arg;
(*pfnWow64DisableWow64FsRedirection)(&arg);
}
else {
// function was missing
}
现在链接器不会找到一个名为Wow64DisableWow64FsRedirection
的未解析符号,因此它不会将该函数放入导入表中,并且Windows不会在进程启动时查找它。
- std::async from std::async in windows xp
- 如何在Visual Studio 2017中编译Windows XP的代码
- 如何构建使用Visual Studio 2017的Windows XP的Winsock2(WS2_32.LIB)应用程序
- WinHttpSendRequest and HTTPS on Windows XP
- 功能本地静态为Windows XP生成故障代码
- SHOpenWithDialog analog for windows XP?
- 如何检查操作系统是否至少是Windows XP SP3
- 使用Visual Studio 2012针对Windows XP构建Boost 1.52库
- 使用 Build Tools 2015 (不带 Visual Studio) 面向 Windows XP
- 有任何替代SHGetKnownFolderPath的Windows XP用户令牌的方案吗
- 当Windows XP(32位,SP3)播放声音时,随机应用程序暂停半秒钟
- 函数从windows XP中的数据包中检索标头目标地址
- GetConsoleScreenBufferInfoEx equivalent for windows XP?
- 如何跟踪Windows 7是否在C ++中以编程方式进入睡眠或休眠状态,就像在Windows XP中所做的那样
- 如何从Windows XP下的程序中知道或更改Windows事件日志的大小
- 带Realtek Alc888的活动耳机插孔(Windows XP)
- 如何使用Visual Studio 2012编译Windows XP
- Visual C 2012 Express Compied Application在Windows XP上不起作用
- 在Windows上运行C 应用程序的必要条件,并从VS 2012中获取XP定位
- 在XP上使用windows文件资源管理器时,停止打开explorer.exe任务栏