在 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 2017来调试python

如何离线安装Visual Studio 2017

微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版

在Windows10下在WSL中使用visual studio code

如何在使用WIN10 Visual Studio 2015 编译FlightGear源码(2020.1.1版本)

如何在使用WIN10 Visual Studio 2015 编译FlightGear源码(2020.1.1版本)