找回密码
 加入
搜索
查看: 2883|回复: 7

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

[复制链接]
发表于 2018-7-30 09:16:03 | 显示全部楼层 |阅读模式

在默认情况下,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 ;


评分

参与人数 1金钱 +50 收起 理由
chishingchan + 50 赞一个!

查看全部评分

发表于 2018-7-30 10:06:20 | 显示全部楼层
本帖最后由 nmgwddj 于 2018-7-30 10:21 编辑

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

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

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

 楼主| 发表于 2018-7-30 12:36:57 | 显示全部楼层
nmgwddj 发表于 2018-7-30 10:06
这个我想说下自己的看法。

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

我只是记录一下而已。
发表于 2018-7-30 14:48:52 | 显示全部楼层
这个方法之前我研究安装输入法的时候用过了,温故知新。
发表于 2018-7-30 16:36:19 | 显示全部楼层
nmgwddj 发表于 2018-7-30 10:06
这个我想说下自己的看法。

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

关键是把程序编译成 64 位,很多人是32位系统用不了。
发表于 2018-7-31 12:27:16 | 显示全部楼层
本帖最后由 nmgwddj 于 2018-7-31 12:28 编辑
志艺风云 发表于 2018-7-30 16:36
关键是把程序编译成 64 位,很多人是32位系统用不了。

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

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

好吧,还是 32 位更招人喜欢。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-28 19:23 , Processed in 0.071352 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表