Hive注册表那点事(5.0 VS 6.0)

news/2024/5/18 22:58:01 标签: thread, signal, 存储, windows, mobile, api

Hive 注册表那点事( 5.0 VS 6.0 )
现象
       5.0 移置到 6.0 上的时候,发现 Hive-Registry 无效,具体的现象是在控制面板中屏幕校准后 Cold Boot 机器校准数据丢失。

       环境变量 PRJ_ENABLE_REGFLUSH_THREAD 和 PRJ_ENABLE_FSREGHIVE 配置为 1 ,同时注册表项 "RegistryFlags " 配置为 0 。

分析
      首先温习一下 Hive 注册表信息更新的相关基本知识
通过配置注册表 HKEY_LOCAL_MACHINE/init/BootVars 下的注册项 "RegistryFlags " 来配置 Hive 注册表的数据更新方法。

注册项 "RegistryFlags " 可能的值及其含义如下:

Dword value
 Description
 
none or 0
 Default setting. Flushes the registry nondeterministically .
 
1
 Enables aggressive flushing
 
2
 Disables background flushing
 

       详细解释如下:

       当配置为 1 的情况下,将使用 Aggressive Flush 的方式来更新 Hive 数据,也就是 Flush On Close ,即在每次调用 RegCloseKey 的时候会更新一次注册表,显然比较浪费系统资源。

       当配置为 0 的情况下,使用 Lazy Flush 方式更新注册表,这个也是系统默认的情况。在这种配置情况下,如果依然想保存 Hive 注册表中的更改项的话,有两种如下两种选择:

>> 系统关机前调用 API RegFlushKey 将修改的注册表项写入到存储设备上,如果保存成功将返回成功的标记。

>> 配置环境变量 PRJ_ENABLE_REGFLUSH_THREAD 来创建 Flush 进程来定期更新 Hive 注册表的改动项。

       创建的 Flush 线程的优先级

[HKEY_LOCAL_MACHINE/System/ObjectStore/RegFlush ]

; To monitor the flushing from an external process add "ActivityName " registry value.

; The activity name is a global named event that filesystem will signal on Registry Activity.

;   "ActivityName "=""

; Create an thread in filesys to perform flushing

    "SpawnThread "=dword:1

; Make the thread IDLE priority

    "FlushPriority256"=dword:FF

; ActivityThreshold specifies the # of reg activity before we force a flush

    "ActivityThreshold "=dword:100

; Timeout period in ms for a flush (flush occurs if there have been some changes during this period).

    "FlushPeriod "=dword:1D4C0
 

       系统会按照 SpawnThread 新建一个优先级为 FlushPriority256 的线程,按照 FlushPeriod 周期性地去检查注册表的变化并加以保存。

      本案的分析
本文要重点说明的就是这个地方, 5.0 中和 6.0 中 "FlushPeriod " 的默认值是不一样的, 5.0 中默认值为 0x3E8 即 1000ms ,而 6.0 中为 0x1D4C0 ,即 120000ms 。这个地方的差异就造成了在 6.0 系统下注册表的修改值不能够及时的进行保存。

针对 120000ms 的情况,也就是说,当你修改了注册表后,修改的注册表值将会在大约 120000ms 后才刷新到存储设备上,这也造成了在 6.0 上 Hive 注册表不能够保存的问题。

解决方法
为了在 6.0 能够及时的保存注册表信息,需要将默认的 "FlushPeriod " 的值改为比较小的值,可以在 Platform.reg 中添加如下的值来覆盖系统的默认值:

[HKEY_LOCAL_MACHINE/System/ObjectStore/RegFlush ]

; Timeout period in ms for a flush (flush occurs if there have been some changes during this period).

    "FlushPeriod "=dword:3E8
 

       其实 6.0 上支持 Hive-Registry ,还需要比 5.0 上多配置一个环境变量即 PRJ_ENABLE_FSREGHIVE ,这个也应该时 6.0 的一个 Bug 。    

附带说一句, Windows Mobile6.5 上也存在类似的问题,在此不再赘述。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/guopeixin/archive/2010/04/08/5464105.aspx


http://www.niftyadmin.cn/n/1403815.html

相关文章

2020第11届蓝桥杯C++B组(不确保答案正确性,仅供参考)蓝桥2020:试题 D: 跑步锻炼

【问题描述】 小蓝每天都锻炼身体。 正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。 小蓝跑步已经坚持了很长时间…

User Mode Driver Management介绍(一)

User Mode Driver介绍 Windows CE 6.0中引入了User Mode Driver的概念,可是无论是网上,还是各个芯片厂商提供的方案中,都很少提及这方面的内容。 本文以小郭对存储管理和User Mode Driver Host的理解为基础,结合具体的代码实现&am…

2020第11届蓝桥杯C++B组(不确保答案正确性,仅供参考)蓝桥2020试题 E: 七段码 (思路 无答案)

本题总分:15 分 【问题描述】 小蓝要用七段码数码管来表示一种特殊的文字。 上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。 小蓝要选择一部分二极管(至少要有一个&am…

WinCE中的paging pool

我们知道,在Config.bib配置中,RAM指定的内存区域会被划分为程序内存和对象存储。但在使用paging pool时,RAM段要减去paging pool的大小,剩余空间再划分为程序内存和对象存储。其中程序内存主要为正在运行的程序保存堆和栈的内容。…

在 Ubuntu 20.04 上静默安装matlab 实践

Matlab 自动化部署探索 需求: 某服务端业务需要调用 matlab为方便迭代发布,需要支持基于 docker 的自动化部署(CD) 使用 Matlab 官方 docker 镜像 一键安装,使用方便官方镜像仅支持网络验证官方镜像仅支持基础功能…

2020第11届蓝桥杯C++B组(不确保答案正确性,仅供参考)2020蓝桥试题 F: 成绩统计

试题 F: 成绩统计 时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分 【问题描述】 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 如果得分至少是 60 分,则称为及格。如果得分至少为…

User Mode Driver Management 介绍(二)

3> 调用User Mode Driver Host API来将Driver Load到内存 CeFsIoControl()实际上是一个对文件系统驱动FSD进行操作的函数,需要传入文件夹名字和IoControlCode。 帮助文档中对该函数的解释如下: This function sends an I/O control to a file …

2020第11届蓝桥杯C++B组(不确保答案正确性,仅供参考)2020蓝桥试题 G: 回文日期

试题 G: 回文日期 时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分 【问题描述】 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202&#xff0c…