关掉64位系统中32位程序的目录重定向

在64位Windows系统中运行的32位程序会被系统欺骗.
例如windows\system32的目录实际是windows\syswow64目录的映射.
program files实际是program files(x86)的映射.

注册表的hkey_local_machine\software实际是hkey_local_machine\software\wow6432node子键的映射.

那么如何访问到真正的64位程序的目录和注册表呢?关掉目录重定向即可.

关闭文件的重定向:

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;

注册表就很简单了:

var
  r: TRegistry;
begin

  r := TRegistry.Create;
  r.RootKey := HKEY_LOCAL_MACHINE;
  r.Access := r.Access or KEY_WOW64_64KEY; //注意这一行.
  if r.OpenKey(‘SOFTWARE\abc‘, true) then
  begin
    r.WriteString(‘test‘, ‘test‘);
  end;
  r.Free;

end;

参考:http://www.raysoftware.cn/?p=131

时间: 2024-11-10 08:04:16

关掉64位系统中32位程序的目录重定向的相关文章

判断是64位操作系统还是32位系统

1.IsWow64Process 确定指定进程是否运行在64位操作系统的32环境(Wow64)下. 语法 BOOL WINAPI IsWow64Process( __in HANDLE hProcess, __out PBOOL Wow64Process ); 参数 hProcess 进程句柄.该句柄必须具有PROCESS_QUERY_INFORMATION 或者 PROCESS_QUERY_LIMITED_INFORMATION 访问权限 Wow64Process 指向一个bool值, 如果该

C++内存管理1-64位系统运行32位软件会占用更多的内存吗?

随着大容量内存成为电脑平台常规化的配置,在配置组装机时很多的用户都会选择8GB甚至是16GB的容量规格内存使用在自己的机器上,如果要将这8GB甚至是16GB的内容在系统使用时能充分利用起来的话,你平台必须使用64位的操作系统作为支持. 但值得注意的是虽然64位系统已经在近几年成为主流,但不少的软件或者不少的用户在使用电脑时运行的软件仍为32位版本,这引发了一个有趣的问题.你需要更多或更少的内存来让32位应用程序运行在64位版本的Windows?并且还有一个传言是说“在64位系统运行32位应用程序

64位系统与32位系统区别

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂):可以访问大型数据库.本文介绍的是64位下C语言开发程序注意事项. 1. 32 位和 64 位C数据类型 32和64位C语言内置数据类型,如下表所示: 上表中第一行的大写字母和数字含义如下所示:I表示:int类型L表示:long类型P表示:pointer指针类型32表示:32位系统64表示64位系统如:LP64表示,在64位系统下的long类型和pointer类型长度为64位.64位Li

Linux 系统环境搭建 之 ubuntu 64位系统兼容32位

有些安装了64位系统Ubuntu,但是有些库需要在32位系统才能执行下面提供了一些在64位系统安装32位库的方法 仅仅举个例子,如果有不同的库可以模仿以下写法去安装. sudo apt-get install ia32-libs sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 libstdc++5:i386 libstdc++6:i386 sudo apt-get install g++-multilib apt-ge

64位系统注册32位的directshow filter文件

在SERVER2008上注册自己写的directshow filter 的dll或者ax文件的时候总是提示 [Window Title] RegSvr32 [Content] 模块".\ball.dll"加载失败. 请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的 .DLL 文件是否有问题. 找不到指定的模块. [确定] 经过查阅相关资料,发现必须使用C:\Windows\SysWOW64文件夹下的cmd,然后输入regsvr32 F:\MyRtspFilter\ba

呃,如何使 .NET 程序,在 64位 系统 中,以 32位 模式运行。

其实最简单的方法就是在解决方案中,把平台设为 x86 就好了哈~   但是今天遇到一个第三方的软件,它调用的一个 dll 是 32位 的,可能它没有测试过在 64位 系统下运行的情况,它在编译时是按默认的配置设为了 Any CPU. 但是在 64位 系统中以默认 64位 模式运行时,再调用 32位 的 dll 就报异常了... 于是想到的一个办法就是让它在 64位 系统中,以 32位 模式运行就好了~   在网上搜了一下,没想到 .NET 本身就提供了这个修改工具,叫做 CorFlags.exe

debian 64位系统中添加对32位的支持

dpkg --add-architecture i386 apt-get update apt-get install ia32-libs debian 64位系统中添加对32位的支持,布布扣,bubuko.com

第十七章——配置SQLServer(2)——32位和64位系统中的内存配置

原文:第十七章--配置SQLServer(2)--32位和64位系统中的内存配置 前言: 本文讲述32位和64位系统中的内存配置,在SQLServer 2005/2008中,DBA们往往尝试开启AWE来限制内存.但是,在SQLServer2012以后,这个选项将被弃用,所以不能使用这种方式来控制32位实例的虚拟地址空间.如果你服务器上有很多内存,就只能升级到64位系统.下面是微软给出的内存限制: 虽然2012以后已经弃用AWE,但是了解一下32位系统如何使用AWE(Address Windowi

为什么一个指针在32位系统中占4个字节,在64位系统中占8个字节?

一个指针在64位的计算机上,占8个字节:一个指针在32位的计算机上,占4个字节. 原因如下: 我们都知道cpu是无法直接在硬盘上读取数据的,而是通过内存读取.cpu通过地址总线.数据总线.控制总线三条线对内存中的数据进行传输和操作. 具体流程: 1.cpu通过地址总线,找到该条数据: 2.通过控制总线得知该操作是读操作还是写操作: 3.通过数据总线将该数据读取到cpu或者从cpu写到内存中. 所以, 地址总线的宽度决定了CPU的寻址能力: 数据总线的宽度决定了CPU单次数据传输的传送量,也就是数