【问题标题】:Wow64 on 32 bit system : Revert [duplicate]32位系统上的Wow64:还原[重复]
【发布时间】: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 的调用,此方法才能正常工作。

标签: c++ windows 32bit-64bit 32-bit


【解决方案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);
}

【讨论】:

  • 非常感谢您的回答。根据其他人的建议,我编辑了这个问题,因为答案已经在另一个线程中(我之前尝试过这个问题,但我在代码其他地方犯的一个错误让我认为它不起作用)。但是,根据您的回答和他们的回答,“禁用”之后没有“恢复”。我不应该包含“还原”吗?我不知道如何正确地做到这一点。我在问题中包含了更多细节。谢谢 !亚历克斯
  • 是的,您很可能应该恢复。
  • 谢谢。您认为我在问题中的做法是否正确?我不确定所有 * 和 &...再次感谢!
猜你喜欢
  • 2012-08-28
  • 2011-07-06
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2015-09-26
  • 2018-12-14
相关资源
最近更新 更多