WOW64 32位系统:恢复
问题描述:
这个线程说明如何管理Wow64DisableWow64FsRedirection的函数,在32位和64个系统的工作都: Wow64DisableWow64FsRedirection on 32-bit Windows XPWOW64 32位系统:恢复
然而,他们似乎并没有禁用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);
}
非常感谢你,
Alex
答
您必须检测运行时功能是否可用。
这可以通过调用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);
}
使用'LoadLibrary',然后'GetProcAddress'得到Wow64DisableWow64FsRedirection'的'地址。这将在Windows 10上运行,并且无法在Windows XP上获得地址。您需要将所有自动导入的调用移除到'Wow64DisableWow64FsRedirection'以使此方法起作用。 –