WinCE下注册表类型

WinCE下注册表类型有基于RAM的注册表和基于HIVE的注册表两种。
一、基于RAM的注册表,用于将注册表数据全部保存在RAM中。
1. 从CE v1.0开始到CE .NET之前,仅采用此技术来保存注册表。每个新创建的内核都默认采用此技术来保存注册表。
2. 适合频繁热启动而不冷启动的设备。系统关闭时提供低电源给RAM。如果断电,重新启动设备后,系统将从内核中重新读取注册表数据到RAM。当然以前保存的用户数据已经丢失。
3. 基于RAM的注册表也能够永久保存注册标数据。CE提供了两个机制。
① 第一种机制的设计思路是在设备关闭前调用RegCopyFile函数将整个注册表数据以文件形式保存到永久存储器上。重新启动设备时,调用RegRestoreFile函数将文件全部读出到RAM中。但是这时必须一次热启动才能使恢复的注册表数据有效。所以每次启动就多出一次热启动。
② 另一种机制可以避免前一种机制的需要两次启动的缺点。但也有它的缺点。OEM(原始设备制造商)可以在OAL层编写WriteRegistryToOEM and ReadRegistryFromOEM两个函数,内核在启动时会自动调用ReadRegistryFromOEM函数来读注册表数据。而应用程序调用RegFlushKey函数时,这个函数用调用WriteRegistryToOEM函数写注册表数据到永久存储器上。这个机制避免了两次启动的缺陷。但问题出现在内核启动时,调用ReadRegistryFromOEM之前文件系统驱动程序还没加载,那就无法打开、读取文件。CE帮助文件中说解决办法是将从永久存储器中读取数据的代码加到ReadRegistryFromOEM中。帮助中说的意思可不是调用ReadFile这么简单的,因为文件系统驱动程序还没加载。
③ 个人建议:如果要采用基于RAM的注册表保存机制,而且要求永久保存注册表数据,使用第一种机制比较容易。
二、 基于HIVE的注册表,用于将注册表数据全部或部分保存到永久存储器上。
1.它是从CE.NET开始采用的新技术。适合经常冷启动而不热启动的设备。
2.支持多用户信息分别保存。当一个用户登录时,加载这个用户的注册表数据,注销时卸载这个用户的注册表数据。
3. HIVE是指一组键,包括子键、键值、数据,是保存或者加载注册表数据的单位,分为系统HIVE(system hive)、用户HIVE(uer hive)、引导HIVE(boot hive)。
① 系统HIVE包含了关于系统的设置信息。具体保存注册表中HKEY_LOCAL_MACHINE、HKEY_CLASSES_ROOT、HKEY_USERS键下所有数据。保存系统HIVE的文件的路径在【HKEY_LOCAL_MACHINE\init\BootVars】下,键名为"systemhive",键值为文件的路径。默认为"\Documents and Settings\system.hv"。
② 用户HIVE包含了一个用户的信息。具体保存注册表中HKEY_CURRENT_USER键下所有数据。保存用户HIVE的文件的路径同样为【HKEY_LOCAL_MACHINE\init\BootVars】下,键名为"profiledir",键值为所有用户HIVE的共同目录。默认为"\Documents and Settings",在这个目录下包含了以每个用户名命名的子目录。子目录里含有一个文件,默认文件名为user.hv。
③ 引导HIVE保存在ROM(内核)中。具体保存内容同系统HIVE一样。当解压内核并加载注册表时,系统先将引导HIVE数据读出,引导HIVE包含了永久存储器的驱动程序和文件系统的驱动程序,这些驱动加载后,系统HIVE被加载,然后引导HIVE被释放。因为引导HIVE被包含在内核中,所以存在一种情况:如果重新做了一个新内核,引导HIVE中的数据同系统HIVE可能不相同。那么系统该加载哪个版本好呢?为此,CE在生成每个内核时都做了一个标志。而系统HIVE也存在这样一个标志,当加载引导HIVE时,如果引导HIVE和系统HIVE的标志不相同,系统会删除系统HIVE文件,然后重新创建一个文件并从引导HIVE复制数据。
4. 永久保存注册表数据
Windows CE.NET采用新的注册表保存技术――基于HIVE的注册表,的确让人很兴奋,在这之前基于Windows CE的设备,大多数采用给RAM供电方式来保存注册表数据,虽然也可以通过RegCopyFile函数永久保存,但毕竟启动时还要再热启动一次,有了基于HIVE的技术,启动时系统会自动加载数据,免去了热启动的麻烦,而且当内核更新升级时,你不用担心保存在永久存储器上的系统HIVE文件影响你新的内核,系统会自动判断并删除过时的系统HIVE文件。

 

一种基于RAM的注册表的保存和恢复方法
//使用基于RAM的注册表,利用RegCopyFile和RegRestoreFile
//实现永久保存注册表数据
#include <Pkfuncs.h>
#include <winbase.h>

//导出。在系统关闭前
if(! RegCopyFile(L"\\ResidentFlash\\RegBackup.reg"))     //导出注册表
{
return FALSE;
}

//导入。在系统启动时
if(! RegRestoreFile(L"\\ResidentFlash\\RegBackup.reg"))     //恢复注册表
{
return FALSE;
}
if(! KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL)) //重新启动
{
return FALSE;
}

posted on 2014-05-16 23:31  IOTer  阅读(728)  评论(0编辑  收藏  举报

导航