转载源地址 https://www.cnblogs.com/xenophon/p/4956218.html

在 64 位系统上,32 位程序读写部分注册表路径时会被系统重定向,这有些类似于读写 System32 文件夹的处理方式。比如,写入 HKLM\Software\KeyName,却发现实际写入到 HKLM\Software\Wow6432Node\KeyName,读取亦是如此。现实中发现,很多的程序员在检测一个程序在 HKLM 键下面的注册表信息,通常会针对 HKLM\Software 和 HKLM\Software\Wow6432Node 分别检查,实际上这样检查毫无效果。对于 32 位程序而言,访问 HKLM\Software 时,系统底层会重定向到 HKLM\Software\Wow6432Node,并不能得到真正的 HKLM\Software 下面的信息,即便再访问一次 HKLM\Software\Wow6432Node,经测试也是访问 Wow6432Node 下面的值,和直接访问 HKLM\Software 并没有任何区别。如果你仔细阅读 MSDN 上关于注册表重定向和访问权限等资料,会发现微软提供了两个特殊的注册表权限位:KEY_WOW64_32KEY、KEY_WOW64_64KEY,来控制访问权限。所以,当使用 RegOpenKeyEx 或 RegCreateKeyEx 访问注册表的 HKCR 或 HKLM\Software 下的路径,不需要显式指定 Wow6432Node,而是应当通过其权限位,如 KEY_READ,和上述二者之一进行组合来控制具体的访问位置。如果开发者显示指定 HKLM\Software\Wow6432Node,则程序在任何情况下都是访问这个路径。但是在 32 位系统中,这个路径默认并不存在,如果强行创建,依然没有任何意义。为了保持统一以及遵循 API 的规范,我们应该做到不显式指定 Wow6432Node 子键。如果不通过权限位进行访问视图控制,可能会造成代码逻辑混乱,如访问不同的注册表路径实际上底层逻辑相同,或者同样的代码编译为 32 位或 64 位后逻辑不一致等等。所以,如果要检测 32 位和 64 位注册表 HKLM\SOFTWARE\KeyName 下是否存在 ValueName,规范的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

BOOL WINAPI RegCheckValueTest(void)

{

    DWORD dwWowFlags[] = { KEY_WOW64_32KEY, KEY_WOW64_64KEY };

    DWORD dwWowCount = ARRAYSIZE(dwWowFlags);

    for (size_t i = 0; i < dwWowCount; i++)

    {

        HKEY hKey = NULL;

        DWORD dwAccess = KEY_READ | dwWowFlags[i];

        DWORD dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\KeyName"), dwAccess, &hKey);

        if (dwError == NO_ERROR)

        {

            dwError = RegQueryValueEx(hkeySub, _T("ValueName"), NULL, NULL, NULL, NULL);

            RegCloseKey(hKey);

            if (dwError == NO_ERROR)

            {

                return TRUE;

            }

        }

    }

    return FALSE;

}

在不同 CPU 位数的系统上,32 位和 64 位程序分别使用不同的权限位组合访问 HKLM\Software 时,系统底层实际访问的注册表位置如下表所示:

系统架构 程序架构 显式访问路径 实际访问路径 备注
权限位不含 KEY_WOW64_* 权限位包含 KEY_WOW64_32KEY 权限位包含 KEY_WOW64_64KEY
32 位系统 32 位程序 HKLM\Software HKLM\Software 原因:在 32 位系统上不存在不同访问视图
影响:参数 KEY_WOW64_* 被系统忽略
64 位系统 32 位程序 HKLM\Software HKLM\Software\Wow6432Node HKLM\Software\Wow6432Node HKLM\Software  
64 位程序 HKLM\Software HKLM\Software
32 位程序 HKLM\Software\Wow6432Node HKLM\Software\Wow6432Node 原因:在路径中显式指定了 Wow6432Node 节点
影响:参数 KEY_WOW64_* 被系统忽略
64 位程序

备注:注意RegOpenKeyEx第四个形参,KEY_QUERY_VALUE或者KEY_READ、KEY_ALL_ACCESS等,权限是有区别的,不要越权操作,否侧会被返回为空。

KEY_QUERY_VALUE显然权限低于KEY_ALL_ACCESS。

可见,32 位程序访问注册表 HKLM\Software 路径时,默认会被重定向到 HKLM\Software\Wow6432Node,如果权限位指定 KEY_WOW64_64KEY 时则访问 HKLM\Software。64 位程序访问注册表 HKLM\Software 路径时,默认会访问 HKLM\Software,如果权限位指定 KEY_WOW64_32KEY 时则访问 HKLM\Software\Wow6432Node。当然,前提是程序并没有受到注册表虚拟化影响,否则会被写入到以下注册表位置:

1

2

HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE

HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Wow6432Node

实际观察发现 HKCU\SOFTWARE\Wow6432Node 下面只有极少量的数据,因此 HKCU\SOFTWARE\Wow6432Node 下面(包括其他从此处映射的键)的注册表键通常可以忽略。这可以说明,注册表针对 32 和 64 位的重定向仅针对 HKLM(包括其他从此处映射的键)有效,如果要访问 HKCU 下面的节点,通常无需考虑重定向的问题。而在 32 位系统上,不存在注册表重定向的问题。

关于注册表重定向的更多信息,请访问:
https://msdn.microsoft.com/en-us/library/aa384253.aspx
https://msdn.microsoft.com/en-us/library/aa384129.aspx

关于windows注册表重定向和虚拟化分析相关推荐

  1. Windows重定向技术【文件重定向与注册表重定向】

    目录 重定向技术 重定向技术适用版本: 重定向技术产生原因:为了确保32位程序能够顺利运行 一:重定向-文件重定向 文件重定向原因:为了确保32位程序能够顺利运行 文件重定向产生场景: 文件重定向具体 ...

  2. Windows如何读取Linux,Linux下读取Windows注册表

    原本以为Linux下读取Windows的注册表是个异想天开.无法实现的想法,忽然发现了老外写的一段小文章 http://www.linuxidc.com/Linux/2011-04/34100p2.h ...

  3. 修改.html 打开方式 注册表,windows 注册表修改资料打开方式

    windows 注册表修改文件打开方式 描述遇到的问题 在打开jsp文件时,右击选择打开方式中选择dreamweaver,但是却是以firefox打开 初步分析应该是jsp也和firefox进行了关联 ...

  4. win7 java注册表_使用JAVA和JNA在64位Win 7上读/写Windows注册表

    我正在尝试使用JAVA在64位Win7上读/写 Windows注册表. 首先,我尝试了JDK java.util.prefs.Preferences and its reflection usage. ...

  5. Windows注册表及常见子项

    Windows注册表五大根键以及常用注册表项 注册表概述:注册表是Windows操作系统.硬件设备以及客户应用程序得以正常运行和保存设置的核心"数据库",也可以说是一个非常巨大的树 ...

  6. 10#Windows注册表的那些事儿

    引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...

  7. 对一个windows2000注册表项的粗略分析(转)

    对一个windows2000注册表项的粗略分析(转)[@more@] [HKLMSOFTWAREMicrosoftWindows NTCurrentVersionImage File Executio ...

  8. Windows 注册表

    <1>64位操作系统上的注册表 <2>文件系统重定向 <3>UAC <4>注册表重定向 <5>SysWoW64 <6>注册表存放 ...

  9. Windows注册表的那些事儿

    引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...

最新文章

  1. 受用一生的高效 PyCharm 使用技巧(六)
  2. 利用外部命令Oralce数据库导入导出
  3. C++知识点17——使用C++标准库(顺序容器vector常用操作)
  4. 一分钟教你学会python_十分钟教你学会python编写小游戏
  5. 差值平方和匹配_纯前端实现图片的模板匹配
  6. 记一次生成唯一ID的问题
  7. [USACO18OPEN]Talent Show
  8. 将深度缓冲z值变换到相机坐标系
  9. ANT发送邮件需要的3个JAR包
  10. 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)...
  11. keypress事件中键盘上每个键的KeyAscii值(易语言/VB)
  12. 计算机二级怎么样分屏方便,一招实现电脑分屏,比你想象中更简单
  13. openssl 签发证书相关命令
  14. 若依管理系统windows本地运行教程
  15. Android性能优化之解密ZAKER,网易云阅读等新闻应用的内容缓存加载方式
  16. 在微型计算机中 多媒体信息包括,公务员考试常识题:1、具有多媒体功能的微型计算机系统中,常用的CD-ROM是...
  17. 构建企业内部的管理系统
  18. cadence16.6完全卸载,不影响再次安装的方法
  19. 中国第一封email
  20. 开源活动_获得开源薪水,成为社会活动家

热门文章

  1. 波司登的高端之路,难走!
  2. vue导入excel进度条_Vue 前端开发——导入Excel/Csv
  3. nginx 允许跨域_细谈跨域请求的桥梁
  4. python 抓取目录树_python 获取文件下所有文件或目录os.walk()的实例
  5. mfc messagebox 非模态_進博尋寶記:當進博遇見非遺?愛上中國傳統文化--財經-
  6. duck typing java_编程语言中的鸭子类型 Duck Typing
  7. Javaweb-----HTTP协议
  8. BUUCTF-----actf_2019_babyheap (UAF)
  9. 学习Python一定要会的4个高阶函数
  10. LabelImg 批量生成标注图片文件夹序号(起始值+终值)