32位系统上的Wow64:还原[重复]

Posted

技术标签:

【中文标题】32位系统上的Wow64:还原[重复]【英文标题】:Wow64 on 32 bit system : Revert [duplicate] 【发布时间】:2017-09-04 20:08:50 【问题描述】:

此线程解释了如何管理 Wow64DisableWow64FsRedirection 函数以在 32 位和 64 位系统上工作: Wow64DisableWow64FsRedirection on 32-bit Windows XP

但是,在禁用 Wow64 后,它们似乎没有恢复。

通常,代码是:

PVOID pOldValue = NULL;
Wow64DisableWow64FsRedirection(&pOldValue);
std::string path = C:/Windows/system32/prog.exe;
ShellExecuteA(NULL, ("open"), LPCSTR(path.c_str()), NULL, NULL, SW_SHOWNORMAL);
Wow64RevertWow64FsRedirection(pOldValue);

但是,对于其他线程中显示的代码,没有“还原”:

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);
    std::string path = C:/Windows/system32/prog.exe;
ShellExecuteA(NULL, ("open"), LPCSTR(path.c_str()), NULL, NULL, SW_SHOWNORMAL);

我认为我应该执行以下操作,但我不确定所有 * 和 &

typedef BOOL WINAPI fntype_Wow64DisableWow64FsRedirection(PVOID *OldValue);
auto pfnWow64DisableWow64FsRedirection =(fntype_Wow64DisableWow64FsRedirection*)GetProcAddress(GetModuleHandleA("kernel32.dll"), "Wow64DisableWow64FsRedirection");

typedef BOOL WINAPI fntype_Wow64RevertWow64FsRedirection(PVOID OldValue);
auto pfnWow64RevertWow64FsRedirection = (fntype_Wow64RevertWow64FsRedirection*)GetProcAddress(GetModuleHandleA("kernel32.dll"), "Wow64RevertWow64FsRedirection");

if (pfnWow64DisableWow64FsRedirection) 

    // function found, call it via pointer
    PVOID arg;
    (*pfnWow64DisableWow64FsRedirection)(&arg);
    std::string path = C:/Windows/system32/prog.exe;
    ShellExecuteA(NULL, ("open"), LPCSTR(path.c_str()), NULL, NULL, SW_SHOWNORMAL);
    ShellExecuteA(NULL, ("open"), LPCSTR(path.c_str()), NULL, NULL, SW_SHOWNORMAL);
    (*pfnWow64RevertWow64FsRedirection)(arg);

非常感谢,

亚历克斯

【问题讨论】:

使用LoadLibrary,然后GetProcAddress得到Wow64DisableWow64FsRedirection的地址。这将在 Windows 10 上运行,并且无法在 Windows XP 上获取地址。您需要删除所有自动导入的对 Wow64DisableWow64FsRedirection 的调用,此方法才能正常工作。 【参考方案1】:

无论该功能是否可用,您都必须检测运行时。

这可以通过调用LoadLibrary + GetProcAddress 获取函数地址来完成。通常delay loading 会是一个替代方案,但它在 kernel32.dll 上不受支持。

typedef BOOL (WINAPI*W64DW64FR)(PVOID *OldValue);
W64DW64FR w64dw64fr = (W64DW64FR) GetProcAddress(LoadLibraryA("kernel32"), "Wow64DisableWow64FsRedirection");

if (w64dw64fr) 

   PVOID old;
   w64dw64fr(&old);

【讨论】:

非常感谢您的回答。根据其他人的建议,我编辑了这个问题,因为答案已经在另一个线程中(我之前尝试过这个问题,但我在代码其他地方犯的一个错误让我认为它不起作用)。但是,根据您的回答和他们的回答,“禁用”之后没有“恢复”。我不应该包含“还原”吗?我不知道如何正确地做到这一点。我在问题中包含了更多细节。谢谢 !亚历克斯 是的,您很可能应该恢复。 谢谢。您认为我在问题中的做法是否正确?我不确定所有 * 和 &...再次感谢!

以上是关于32位系统上的Wow64:还原[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Wow64DisableWow64FsRedirection 在 32 位 Windows XP 上

32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)

32位机上用vs2008开发的c++程序如何能在64位系统下运行?

在 Win64 操作系统中从 32 位应用程序解析 PROGRAMFILES 变量?

在64位操作系统上,下面程序返回啥结构

64位系统下注册32位dll文件