wince注册表结构 下载本文

内容发布更新时间 : 2025/1/16 4:54:07星期一 下面是文章的全部内容请认真阅读。

wince注册表结构

与桌面Windows一样,Windows CE也使用注册表(Registry)来保存应用程序、驱动程序和用户的设定以及其他一些配置信息。Windows CE注册表也采用树形结构来管理配置信息,由于Windows CE注册表的结构和功能与桌面Windows几乎一样,在这里就不详细介绍了,读者可以参考其它关于注册表的资料。

Windows CE支持四个根键,描述如下: 键名 描述

HKEY_LOCAL_MACHINE 硬件和驱动配置数据 HKEY_CURRENT_USER 用户配置数据

HKEY_CLASSES_ROOT OLE和文件类型匹配配置数据 HKEY_USERS 适用于所有用户的数据

由于嵌入式系统的特点,一些嵌入式设备是没有外存的。因此Windows CE的注册表提供了两种实现方式:基于RAM的注册表(RAM-Based Registry)和基于Hive的注册表(Hive-Based Registry)。我们可以选择在Windows CE中使用任何一种注册表,注册表类型对于用户和应用程序来说是透明的。  基于RAM的注册表

正如其名,基于RAM的注册表把整个注册表作为一个对象存储堆存放在系统的内存中。这意味着如果对系统进行冷启动或者系统断电,对注册表的所有改动都会丢失。

如果使用基于RAM的注册表,对注册表的读写访问操作会变得非常高效。因此基于RAM的注册表比较适用于没有外部存储,而且有电池保存内存数据(battery-backed RAM)的设备。如果有外存且经常冷启动的设备采用基于RAM的注册表,则需要在系统断电的时候对注册表进行保存,等系统再次启动时对保存的注册表进行还原。

Windows CE提供了两种方法用来断电保存基于RAM的注册表:

1. Windows CE提供了两个系统API用来保存和还原整个注册表,它们的原形如下: BOOL RegCopyFile(

LPCWSTR lpszFile // 保存注册表信息的文件的名字 );

BOOL RegRestoreFile(

LPCWSTR lpszFile // 保存注册表信息的文件的名字 );

如果要保存和恢复注册表,我们只需要在系统断电的时候调用RegCopyFile函数将整个注册表保存为外存上的一个文件。当系统重新启动时,我们再调用RegRestoreFile函数将文件全部读出RAM中,然后再热启动系统,我们保存得注册表就可以生效了。值得注意的是这次热启动是必须的,因为只有在系统启动的时候才会去检测RegRestoreFile放在RAM里的注册表信息。这种方法的优点是完全可以使用应用程序来实现基于RAM的注册表的保存,而且这种方法相对简单。但是此方法的缺点是需要两次启动。因此效率相对比较低。

2. 第二种方法需要OEM的参与,OEM可以在BSP的OAL层中实现WriteRegistryToOEM和ReadRegistryFromOEM两个函数,它们的声明为: DWORD ReadRegistryFromOEM(

DWORD dwFlags, // 参数, REG_READ_BYTES_START表示读新的注册表 LPBYTE lpData, // 指向注册表数据的缓冲区,由OS分配 DWORD cbData // 缓冲区的大小 );

BOOL WriteRegistryToOEM(

DWORD dwFlags, // 参数,REG_WRITE_BYTES_START表示写新的注册表 LPBYTE lpData, // 指向注册表数据的缓冲区,由OS分配 DWORD cbData // 缓冲区的大小,0表示到达注册表尾部 );

Windows CE会在系统启动和关闭的时候调用这两个函数来保存和恢复注册表。此种方法虽然可以避免两次启动,但是困难的地方是ReadRegistryFromOEM函数的实现比较困难,因为在系统启动的时候,块设备驱动和文件系统的驱动都还没有加载,因此不能使用CreateFile,ReadFile这样的文件系统API来实现ReadRegistryFromOEM函数,只能使用一些更底层的操作来实现。  基于Hive的注册表

自从Windows CE 4.0之后,Windows CE提供了基于Hive的注册表。基于Hive的注册表把注册表数据存放在文件系统的文件上,这种文件被称作蜂箱Hive。这就意味着不再需要在系统断电和启动时进行保存恢复注册表操作。

Hive是注册表中的一组键,子键和值。Hive是文件系统上表现为单个文件。Windows CE中有三种Hive。 类型 文件 描述

Boot hive ROM中的Boot.hv HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有数据。只在启动时使用。 System hive 由OEM决定

(通常是System.hv) HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有数据。包含设备范围内不随着用户改变而改变的数据。

User hive User.hv HKEY_CURRENT_USER下的所有数据。 包含用户特有的设置,每个用户都有一个单独的User.hv。

基于Hive的注册表适用于对于有永久存储并且需要经常冷启动的设备。我们也可以看到,基于Hive的注册表把系统数据和用户数据分开存放,这就意味着基于Hive的注册表还提供多用户支持。对于每一个用户,可以提供不同的User.hv,当用户登录时加载相应的User.hv,从而达到多用户目的。

注册表类型分为基于对象存储的注册表和基于HIVE的注册表,在制定内核的时候只能选择其中一种。从理论上讲这两种注册表都能够实现永久保存注册表数据,不过采用不同的类型会影响CE的启动顺序和启动速度,还会影响内存的使用量。我还是趋向于采用基于HIVE的注册表来实现永久保存注册表数据,这也是个发展趋势。在讲解之前先简单描述如果CE采用基于HIVE的注册表,那么在启动时怎么加载已保存的注册表数据: 1、nk.exe执行,启动filesys.exe。

2、filesys.exe加载引导HIVE,此时引导HIVE位于nk.bin解压之后的文件中。 3、filesys.exe启动device.exe,之后处于等待状态,等待device.exe将包含系统HIVE的文件系统和存储设备的驱动程式加载完毕。而这个文件系统和存储设备的驱动程式存在于引导HIVE中。 4、device.exe加载上述所说的文件系统驱动程式和存储设备驱动程式,使之开始工作。之后device.exe处于等待状态。

5、filesys.exe被唤醒,加载并且安装系统HIVE。之后filesys.exe处于等待状态。 6、nk.exe按照系统HIVE的信息开始执行初始化工作。其中包括加载驱动程式和启动一些应用程式。其中加载驱动程式一般由device.exe执行,而启动应用程式由filesys.exe执行。这时device.exe和filesys.exe已被唤醒。

因为引导HIVE和系统HIVE肯定有重复的地方,所以可能出现重复加载了驱动程式或

重复启动了应用程式。为此,CE允许在描述驱动程式的注册表信息中加入防止重复的标志,而应用程式能采用事件对象来防止重复启动,如device.exe。

下面讲述怎么设置基于HIVE的注册表(如果保存系统HIVE的是FAT文件系统): 1、在PB中加入\Registry\,如果是Geode平台,再加入BSP_ENABLE_FSREGHIVE环境变量。 2、打开platform.reg,找到如下信息:

; HIVE BOOT SECTION

[HKEY_LOCAL_MACHINEinitBootVars]

\\system.hv\\\IF BSP_ENABLE_FSREGHIVE \ENDIF

; END HIVE BOOT SECTION

\的值为系统HIVE文件的路径。\是个布尔值,指示是否开始就执行设备管理器device.exe,按照CE帮助文件的说法,只有想把系统HIVE存储在对象存储中才在此设置为0,所以一般都要设置为1。

3、如果是多用户,能在上述的注册表位置下输入\,指定默认的用户名。如果是单用户系统,能不设置。

4、确保将包含系统HIVE的文件系统驱动程式的注册表信息和存储设备的驱动程式的注册表信息被包含在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之间,在这两个语句之间的注册表数据全部属于引导HIVE。如果我们将系统HIVE文件system.hv存放在硬盘上,并采用FAT文件系统。那么就要将[HKEY_LOCAL_MACHINESystemStorageManagerFATFS]和[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]移动到“; HIVE BOOT SECTION”下。

5、在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之间的所有驱动程式的注册表信息中都加入下列一个标志: Flags\

这个标志是个位掩码,他能和其他已存在的\或运算。值1000表示此驱动程式只加载一次,这样device.exe就不会把当前驱动程式加载两次了。

6、在包含系统HIVE的存储设备的驱动程式的注册表信息中,加入如下标志(假设是硬盘): [HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile] \

这个标志表示这个存储设备包含系统HIVE文件。

按照如上所述设置后的内核就能实现永久存储注册表数据了。对于保存注册表数据的执行动作在此必须阐述清晰:

正常情况下,CE能够确保重要的注册表数据能够从内存刷到(Flush)永久存储器上。不过这并不能完全确保所有数据都能完整地保存而不丢失,所以要确保万无一失,应该主动地调用RegFlushKey函数强制将内存中的数据刷到永久存储器上。这个函数的参数只有一个,就是注册表分支。CE还增加一个注册表项(如下所示),他的作用是每当函数RegCloseKey被调用时都自动调用RegFlushKey函数。 [HKEY_LOCAL_MACHINEinitBootVars] \