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位系统下运行?