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

+0

使用'LoadLibrary',然后'GetProcAddress'得到Wow64DisableWow64FsRedirection'的'地址。这将在Windows 10上运行,并且无法在Windows XP上获得地址。您需要将所有自动导入的调用移除到'Wow64DisableWow64FsRedirection'以使此方法起作用。 –

您必须检测运行时功能是否可用。

这可以通过调用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); 
} 
+0

非常感谢您的回答。根据其他人的建议,我编辑了这个问题,因为答案已经存在于另一个线程中(我之前尝试过这个问题,但是我在代码中的其他地方犯的错误使我认为它不起作用)。然而,随着你的回答和他们的回答,在“禁用”之后没有“恢复”。不应该包含“回复”。我不知道如何做对。我在这个问题中包含了更多细节。谢谢 !亚历克斯 – alecs26

+0

是的,你很可能应该恢复。 – Anders

+0

谢谢。你认为我在问题中的做法是对的吗?我不确定所有的*和...再次感谢! – alecs26