在 Window 10 的 Visual Studio 中为 64 位编译时,Wow64DisableWow64FsRedirection() 函数不起作用
Posted
技术标签:
【中文标题】在 Window 10 的 Visual Studio 中为 64 位编译时,Wow64DisableWow64FsRedirection() 函数不起作用【英文标题】:Wow64DisableWow64FsRedirection() function not working when compiled for 64-bit in Visual Studio in Window 10 【发布时间】:2017-07-07 19:13:46 【问题描述】:我遇到了Wow64DisableWow64FsRedirection()
的问题。
当我在 Visual Studio 2010 中为 64 位平台编译时,它无法在 Window 10 中运行,它返回错误 1。
但是,当我为 32 位平台编译时,该函数在 Window 10 中工作。
typedef BOOL(__stdcall *tFSRED)(HMODULE );
HMODULE hKernel = LoadLibrary(_T("Kernel32.dll")); // Get Kernel module handle
if (hKernel == NULL)
return 2;
tFSRED pFunc;
pFunc = (tFSRED) GetProcAddress(hKernel, "Wow64DisableWow64FsRedirection");
ret = pFunc(&oldValue); // Turn the file the file system redirector off
if (ret == FALSE)
_tprintf(_T("\nFile System Redirection could not be turned off. Reason: %d"), GetLastError());
return 4;
// ret is always TRUE when compile through 32-bit platform
// but ret return FALSE when compile through 64-bit platform
在Visual Studio中,如果我编译为64位平台,那么编译后如果我在depends.exe
打开生成的EXE,EXE前面会显示64。
选择32位平台后,生成的EXE是32位的。该 EXE 在我的情况下可以工作,但我希望我的 EXE 是 64 位的,所以我选择 64 位平台,我得到了一个 64 位的 EXE,但它不像我上面解释的那样工作。
【问题讨论】:
在问题正文中包含代码,以便您可以将其正确格式化为代码。 【参考方案1】:WOW64 仿真仅适用于在 64 位系统上运行的 32 位可执行文件。 64 位 EXE不应该尝试使用 WOW64 函数(可能是 IsWow64Process()
除外),因为 EXE 一开始不会在 WOW64 内部运行。这就是您在 64 位 EXE 中收到错误代码 1 (ERROR_INVALID_FUNCTION
) 的原因。
所以,要么:
ifdef 在 64 位编译中跳过 WOW64 函数的代码:
#ifndef _WIN64
typedef BOOL (WINAPI *tFSDisable)(PVOID*);
typedef BOOL (WINAPI *tFSRevert(PVOID);
HMODULE hKernel = GetModuleHandle(_T("Kernel32"));
tFSDisable pDisableFunc = (tFSDisable) GetProcAddress(hKernel, "Wow64DisableWow64FsRedirection");
tFSRevert pRevertFunc = (tFSRevert) GetProcAddress(hKernel, "Wow64RevertWow64FsRedirection");
PVOID oldValue;
if ((pDisableFunc) && (pRevertFunc))
if (!pDisableFunc(&oldValue)) // Turn off the file system redirector
_tprintf(_T("\nFile System Redirection could not be turned off. Reason: %d"), GetLastError());
return 4;
#endif
// do file system operations as needed...
#ifndef _WIN64
if ((pDisableFunc) && (pRevertFunc))
if (!pRevertFunc(oldValue)) // Restore the file system redirector
_tprintf(_T("\nFile System Redirection could not be restored. Reason: %d"), GetLastError());
return 5;
#endif
仅当IsWow64Process()
报告当前进程实际上在 WOW64 内部运行时,才省略 ifdef 并仅调用 WOW64 函数:
typedef BOOL (WINAPI tW64P)(HANDLE, PBOOL);
typedef BOOL (WINAPI *tFSDisable)(PVOID*);
typedef BOOL (WINAPI *tFSRevert(PVOID);
HMODULE hKernel = GetModuleHandle(_T("Kernel32"));
tW64P pIsWow64Func = (tW64P) GetProcAddress(hKernel, "IsWow64Process");
tFSDisable pDisableFunc = NULL;
tFSRevert pRevertFunc = NULL;
BOOL bIsWow64 = FALSE;
if (pIsWow64Func)
pIsWow64Func(GetCurrentProcess(), &bIsWow64);
if (bIsWow64)
pDisableFunc = (tFSDisable) GetProcAddress(hKernel, "Wow64DisableWow64FsRedirection");
pRevertFunc = (tFSRevert) GetProcAddress(hKernel, "Wow64RevertWow64FsRedirection");
PVOID oldValue;
if ((pDisableFunc) && (pRevertFunc))
if (!pDisableFunc(&oldValue)) // Turn off the file system redirector
_tprintf(_T("\nFile System Redirection could not be turned off. Reason: %d"), GetLastError());
return 4;
// do file system operations as needed...
if ((pDisableFunc) && (pRevertFunc))
if (!pRevertFunc(oldValue)) // Restore the file system redirector
_tprintf(_T("\nFile System Redirection could not be restored. Reason: %d"), GetLastError());
return 5;
【讨论】:
以上是关于在 Window 10 的 Visual Studio 中为 64 位编译时,Wow64DisableWow64FsRedirection() 函数不起作用的主要内容,如果未能解决你的问题,请参考以下文章
微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版
在Windows10下在WSL中使用visual studio code