zoukankan      html  css  js  c++  java
  • Delphi 禁用x64位系统文件重定向功能

           在X64系统里面,一些特殊的目录和特殊的注册表键被分为2个独立的部分。对于文件系统来说,
          %systemroot%system32 目录被保留给64位文件使用,而32位文件会被重定向到%systemroot%SysWOW64目录。
          换句话说,所有的32位程序一般情况下只会出现在%systemroot%SysWOW64目录里面。
          任何32位程序试图访问%systemroot%system32 目录的企图都会被重定向到%systemroot%SysWOW64目录。
          这个是一个默认的行为,除非程序的线程明确的指名需要关闭这种重定向机制。

          在Win7 64位系统下,调用CopyFile函数进行函数拷贝,如果希望拷贝文件到System32目录下,
          需要考虑程序是不是也是64位的,否则,程序会被重定向到Syswow64目录下,
          为了防止出现文件被重定向,就需要调用函数Wow64DisableWow64FsRedirection取消文件的重定向,
          并在完成指定功能后调用Wow64RevertWow64FsRedirection函数进行恢复。

         HKEY_LOCAL_MACHINESoftware下新建一个项,然后使用64位的注册表编辑器查看,
         会发现这个项只会出现在HKEY_LOCAL_MACHINESoftwareWow6432Node键下而不会出
         现在HKEY_LOCAL_MACHINESoftware键下,因为HKEY_LOCAL_MACHINESoftware键是专
         门用于存放64位程序所使用的注册表数据的,而HKEY_LOCAL_MACHINESoftwareWow6432Node
         键是专门用于存放32位程序所使用的注册表数据的。

    var OldWow64RedirectionValue: LongBool;

    function DisableWowRedirection: Boolean;
    type TWow64DisableWow64FsRedirection = function(var Wow64FsEnableRedirection: LongBool): LongBool;
      StdCall;
    var hHandle: THandle;
      Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
    begin Result := true;
      try hHandle := GetModuleHandle('kernel32.dll');
        @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection');
        if ((hHandle <> 0) and (@Wow64DisableWow64FsRedirection <> nil)) then Wow64DisableWow64FsRedirection(OldWow64RedirectionValue);
      except Result := False;
      end;
    end;

    function RevertWowRedirection: Boolean;
    type TWow64RevertWow64FsRedirection = function(var Wow64RevertWow64FsRedirection: LongBool): LongBool;
      StdCall;
    var hHandle: THandle;
      Wow64RevertWow64FsRedirection: TWow64RevertWow64FsRedirection;
    begin Result := true;
      try hHandle := GetModuleHandle('kernel32.dll');
        @Wow64RevertWow64FsRedirection := GetProcAddress(hHandle, 'Wow64RevertWow64FsRedirection');
        if ((hHandle <> 0) and (@Wow64RevertWow64FsRedirection <> nil)) then Wow64RevertWow64FsRedirection(OldWow64RedirectionValue);
      except Result := False;
      end;
    end;

    http://blog.csdn.net/gj333/article/details/8268379

    举例:
    x64: HKEY_LOCAL_MACHINESOFTWAREWow6432NodeEmbarcaderoBDS19.0
    x32: HKEY_LOCAL_MACHINESOFTWAREEmbarcaderoBDS19.0

    http://bbs.2ccc.com/topic.asp?topicid=543793

  • 相关阅读:
    Spring 中的重试机制,简单、实用!
    Docker 常用命令,还有谁不会?
    Java 对象不使用时为什么要赋值为 null?
    为什么 Nginx 比 Apache 更牛叉?
    你还在用命令看日志?快用 Kibana 吧,一张图片胜过千万行日志!
    golang如何体现面向对象思想
    golang 三⾊标记+GC混合写屏障机制
    Golang中逃逸现象-变量何时 栈何时堆
    golang调度器原理与GMP模型设计思想
    golang 程序内存分析方法
  • 原文地址:https://www.cnblogs.com/findumars/p/8001465.html
Copyright © 2011-2022 走看看