gpt4 book ai didi

c++ - 32 位 Windows XP 上的 Wow64DisableWow64FsRedirection

转载 作者:可可西里 更新时间:2023-11-01 13:54:38 26 4
gpt4 key购买 nike

我正在用 Visual Studio C++ 编写一个程序,它需要在运行 Windows XP 32 位或任何更高版本的 Windows 操作系统的任何计算机上作为 32 位进程 native 运行。此程序需要能够访问计算机上的 C:\Windows\system32\ 文件夹,无论该程序是在 64 位还是 32 位系统上运行。为此,我使用 Wow64DisableWow64FsRedirection 来禁用 Windows 通常对 32 位进程执行的重定向,将它们发送到 C:\Windows\syswow64。不幸的是,这会破坏兼容性——尽管我的程序可以在 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 位。 p>

最佳答案

继续使用 Wow64DisableWow64FsRedirection,但不要静态导入它。而是使用动态绑定(bind) (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 也不会在进程启动期间寻找它。

关于c++ - 32 位 Windows XP 上的 Wow64DisableWow64FsRedirection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25413612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com