X64系统 注册表和文件重定向 Python
来源:互联网 发布:淘宝关键词查询 编辑:程序博客网 时间:2024/05/18 01:51
无论是Windows XP Professional X64 Edition、Windows Server2003X64 Edition还是Windows Vista X64 Edition(以下把均统称为X64系统),都引入了一项技术:注册表和文件的重定向。
由于64位Windows系统需要把32位和64位应用程序分开保存,故使用一种名曰“WOW64”的技术,因而也出现了注册表和文件重定向的问题。
一、注册表重定向
为了防止注册表键冲突,注册表在某些键也分成了两个部分。一部分是专门给64位系统访问的,另一部分是专门给32位系统访问的,放在Wow6432Node下面。当32位程序去访问某些键值的时候,和文件转向类似,系统也会自动地把程序的访问转向到Wow6432Node下面。Wow6432Node这个节点存在于HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER下面。
注册表重定向,其实质就是维护两套不同的注册表键,一套用于64位,一套用于32位。受影响的键不只是上面提及的HKLM/Software,还包括:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER/Software/Classes
HKEY_LOCAL_MACHINE/Software
HKEY_USERS/*/Software/Classes
HKEY_USERS/*_Classes
其中,64位程序的注册信息存储在上面的健中,32位程序的注册信息重定向存储在下列健中:
HKEY_CLASSES_ROOT/WOW6432node
HKEY_CURRENT_USER/Software/Classes/WOW6432node
HKEY_LOCAL_MACHINE/Software/WOW6432node
HKEY_USERS/*/Software/Classes/WOW6432node
HKEY_USERS/*_Classes/WOW6432node
当运行32位程序,wow64会截取程序对注册表HKLM/Software的访问,并重定向于HKLM/Software/Wow6432Node。
在64位Windows操作系统下,64位应用程序和32位应用程序的对应注册表是分开的,而32位应用程序对注册表的操作(读、写)都会被重定向到Wow6432Node子键路径(由Wow64机制自动完成),而64位应用程序访问注册表的行为则没有变化。例如,访问HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows \CurrentVersion\Run,
会重定向访问HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows \CurrentVersion\Run,当然64位程序的访问不受影响,此过程对用户透明。
认识这两个宏即可
#defineKEY_WOW64_32KEY (0x0200)
#defineKEY_WOW64_64KEY (0x0100)
(来之winnt.h)
例如对于注册表打开(RegOpenKey),假设原有访问权限为KEY_ALL_ACCESS:
1、32位程序,不修改操作权限,那么访问的是重定向后的注册表键值;如果把权限设置为:
reg_object= win32api.RegOpenKey(hkey, reg_path, 0, win32con.KEY_ALL_ACCESS|win32con.KEY_WOW64_64KEY)
这样就不会被重定向,明确指定了可以访问64位的注册表,访问的仍是自己指定路径下的注册表键。
2、64位程序,不修改操作权限,那么访问的是64位注册表键值;如果把权限值设置为win32con.KEY_ALL_ACCESS|win32con.KEY_WOW64_32KEY,则明确指定去访问32位注册表键值。
如下代码:(在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows \CurrentVersion\Run新建键baiduantray,赋值为abc)
#不会重定向reg_object = win32api.RegOpenKey(hkey, reg_path, 0, win32con.KEY_ALL_ACCESS|<strong>win32con.KEY_WOW64_64KEY</strong>)if reg_object: value = win32api.RegQueryValueEx(reg_object, "baiduantray")[0] print value #输出abc #访问的是32位注册表键值,重定向到Wow6432Node路径下reg_object = win32api.RegOpenKey(hkey, reg_path, 0, win32con.KEY_ALL_ACCESS|<strong>win32con.KEY_WOW64_32KEY</strong>)if reg_object: value = win32api.RegQueryValueEx(reg_object, "baiduantray")[0] print value #输出"C:\Program Files (x86)\Baidu\BaiduAn\4.0.0.4747\BaiduAnTray.exe" -stmd=3 #重定向到Wow6432Node路径下reg_object = win32api.RegOpenKey(hkey, reg_path, 0, win32con.KEY_ALL_ACCESS)if reg_object: value = win32api.RegQueryValueEx(reg_object, "baiduantray")[0] print value#输出"C:\Program Files (x86)\Baidu\BaiduAn\4.0.0.4747\BaiduAnTray.exe" -stmd=3
结果输出:如上代码所示。
注:1)win32con.KEY_WOW64_64KEY意思就是直接访问64位注册表,不要进行重定向,默认的参数是win32con.KEY_WOW64_32KEY。
2)注册表键不区分大小写
二、文件重定向
在X64系统里面,一些特殊的目录和特殊的注册表键被分为2个独立的部分。对于文件系统来说,%systemroot%/system32 目录被保留给64位文件使用,而32位文件会被重定向到%systemroot%/SysWOW64目录。换句话说,所有的32位程序一般情况下只会出现在%systemroot%/SysWOW64目录里面。任何32位程序试图访问 %systemroot%/system32 目录的企图都会被重定向到%systemroot%/SysWOW64目录。这个是一个默认的行为,除非程序的线程明确的指名需要关闭这种重定向机制。
另外%ProgramFiles%这个环境变量并不受这两个API的影响,而只跟应用程序本身是否是32还是64位有关,当你使用ExpandEnvironmentStrings来展开%ProgramFiles%时,如果是32位程序,则返回的路径是C:/Program Files (x86),假设你的系统安装在c盘。而如果是64位程序,则返回C:/Program Files。
参考链接:http://blog.csdn.net/magictong/article/details/5895482
- X64系统 注册表和文件重定向 Python
- x64系统的判断和x64下文件和注册表访问的重定向(1)
- x64系统的判断和x64下文件和注册表访问的重定向(2)
- x64系统的判断和x64下文件和注册表访问的重定向(3)
- x64系统的判断和x64下文件和注册表访问的重定向(1)
- x64系统的判断和x64下文件和注册表访问的重定向(2)
- x64系统的判断和x64下文件和注册表访问的重定向(3)
- x64下文件和注册表访问的重定向
- x64系统的判断和x64下文件和注册表访问的重定向——补记
- [C#]api解决X64系统注册表被重定向问题
- 64位系统下文件重定向和注册表重定向
- RHEL7重定向和文件查找
- [C#]用API的方法解决X64系统注册表被重定向问题
- 2011-06-28 编译信息保存和文件重定向
- 标准输入、输出和错误和文件重定向
- 标准输入、输出和错误和文件重定向
- 标准输入、输出和错误和文件重定向
- 标准输入、输出和错误和文件重定向
- 网站整站下载器
- LESSON: Don't Use Table in Jasper SubReport
- HDU 1241 Oil Deposits(深搜)
- 操作系统存储器管理相关知识.
- 为iOS 6和iOS 7设计界面
- X64系统 注册表和文件重定向 Python
- Matlab学习笔记1
- Lucene学习总结之一:全文检索的基本原理
- 解决struts2 Action中的乱码问题
- 分组背包(每组至少选择一件物品)
- .bash_profile和.bashrc的区别(如何设置生效)
- 练手小项目(2)-生活小助手--身份证查询
- linux 常用网络命令
- 657 - The die is cast