lpxx 发表于 2018-7-30 09:16:03

关于32位系统程序控制Wow64重定向问题

在默认情况下,64位环境运行32位程序,会启用重定向,比如调用CreateFile时,系统会把system32文件夹重定向到Syswow64等等。但是有些时候需要访问system32文件夹的时候就需要关闭重定向。MS已经提供了一组函数用来控制重定向:Wow64EnableWow64FsRedirection,Wow64DisableWow64FsRedirection,Wow64RevertWow64FsRedirection
用法在MSDN里面有DEMO:
#define _WIN32_WINNT 0x0501
#include <Windows.h>

void main()
{
    HANDLE hFile = INVALID_HANDLE_VALUE;
    PVOID OldValue = NULL;

    //Disable redirection immediately prior to the native API
    //function call.
    if( Wow64DisableWow64FsRedirection(&OldValue) )
    {
      //Any function calls in this block of code should be as concise
      //and as simple as possible to avoid unintended results.
      hFile = CreateFile(TEXT("C:\\Windows\\System32\\Notepad.exe"),
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

      //Immediately re-enable redirection. Note that any resources
      //associated with OldValue are cleaned up by this call.
      if ( FALSE == Wow64RevertWow64FsRedirection(OldValue) )
      {
            //Failure to re-enable redirection should be considered
            //a criticial failure and execution aborted.
            return;
      }
    }
   
    //The handle, if valid, now can be used as usual, and without
    //leaving redirection disabled.
    if( INVALID_HANDLE_VALUE != hFile )
    {
      // Use the file handle
    }
}
换成AU3代码,一句就搞定了#RequireAdmin
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1) ; 默认情况下,禁用32位应用程序被重定向到syswow64而不是system32 ;

nmgwddj 发表于 2018-7-30 10:06:20

本帖最后由 nmgwddj 于 2018-7-30 10:21 编辑

这个我想说下自己的看法。

我还是建议如果想操作 System32 目录或者常规注册表位置,还是把程序编译成 64 位,这个应该算是正确的手段。在 AU3 脚本层面,不需要像驱动一样要大面编写积兼容 32 位和 64 位的代码。写起来还是挺简单的。

除非是极端环境,程序必须是 32 位的而需要操作 System32 相关的目录再使用这个方法也不迟。

lpxx 发表于 2018-7-30 12:36:57

nmgwddj 发表于 2018-7-30 10:06
这个我想说下自己的看法。

我还是建议如果想操作 System32 目录或者常规注册表位置,还是把程序编译成 6 ...

我只是记录一下而已。

chishingchan 发表于 2018-7-30 14:48:52

这个方法之前我研究安装输入法的时候用过了,温故知新。

志艺风云 发表于 2018-7-30 16:36:19

nmgwddj 发表于 2018-7-30 10:06
这个我想说下自己的看法。

我还是建议如果想操作 System32 目录或者常规注册表位置,还是把程序编译成 6 ...

关键是把程序编译成 64 位,很多人是32位系统用不了。

nmgwddj 发表于 2018-7-31 12:27:16

本帖最后由 nmgwddj 于 2018-7-31 12:28 编辑

志艺风云 发表于 2018-7-30 16:36
关键是把程序编译成 64 位,很多人是32位系统用不了。
32 位系统用 32 位呀,为什么要用 64 位呢?编译的时候可以编译出两个版本,不同系统分发不同的版本。

afan 发表于 2018-7-31 14:17:23

nmgwddj 发表于 2018-7-31 12:27
32 位系统用 32 位呀,为什么要用 64 位呢?编译的时候可以编译出两个版本,不同系统分发不同的版本。

32位通用啊。一般没特殊要求或对性能有大的影响,编译个32位不就好了

nmgwddj 发表于 2018-7-31 14:46:37

afan 发表于 2018-7-31 14:17
32位通用啊。一般没特殊要求或对性能有大的影响,编译个32位不就好了

好吧,还是 32 位更招人喜欢。
页: [1]
查看完整版本: 关于32位系统程序控制Wow64重定向问题