现在的位置: 首页 > 综合 > 正文

WINCE注册表的存储和加载

2011年08月29日 ⁄ 综合 ⁄ 共 3898字 ⁄ 字号 评论关闭

 

先说原理:

注册表类型分为基于对象存储的注册表和基于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的文件系统和存储设备的驱动程序加载完毕。
4, 而这个文件系统和存储设备的驱动程序存在于引导HIVE中。
5, device.exe加载上述所说的文件系统驱动程序和存储设备驱动程序,使之开始工作。之后device.exe处于等待状态。
6, filesys.exe被唤醒,加载并且安装系统HIVE。之后filesys.exe处于等待状态。
7, nk.exe按照系统HIVE的信息开始执行初始化工作。其中包括加载驱动程序和启动一些应用程序。
其中加载驱动程序一般由device.exe执行,而启动应用程序由filesys.exe执行。这时device.exe和filesys.exe已经被唤醒。

  因为引导HIVE和系统HIVE肯定有重复的地方,所以可能出现重复加载了驱动程序或者重复启动了应用程序。
为此,CE允许在描述驱动程序的注册表信息中加入防止重复的标志,而应用程序可以采用事件对象来防止重复启动,
如device.exe。

下面讲述如何设置基于HIVE的注册表,分基于硬盘和基于flash的2种情况

大家也可以看微软的帮助.

情况1,基于硬盘的永久保存

在PB中加入"Hive-based Registry",如果是Geode平台,再加入BSP_ENABLE_FSREGHIVE环境变量。
打开platform.reg,找到如下信息: ; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\init\BootVars]
"SYSTEMHIVE"="Documents and Settings\\system.hv"
"PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:0
IF BSP_ENABLE_FSREGHIVE
"Start DevMgr"=dword:1
ENDIF
; END HIVE BOOT SECTION
"SYSTEMHIVE"的值为系统HIVE文件的路径。
"Start DevMgr"是一个布尔值,指示是否开始就执行设备管理器device.exe,按照CE帮助文档的说法,
只有想把系统HIVE存储在对象存储中才在此设置为0,所以一般都要设置为1。
如果是多用户,可以在上述的注册表位置下输入"DefaultUser"="",指定默认的用户名。如果是单用户系统,可以不设置。
保证将包含系统HIVE的文件系统驱动程序的注册表信息和存储设备的驱动程序的注册表信息被包含在
"; HIVE BOOT SECTION"和"; END HIVE BOOT SECTION"之间,在这两个语句之间的注册表数据全部属于引导HIVE。
假如我们将系统HIVE文件system.hv存放在硬盘上,并采用FAT文件系统。
那么就要将[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]和
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]移动到"; HIVE BOOT SECTION"下。

在"; HIVE BOOT SECTION"和"; END HIVE BOOT SECTION"之间的所有驱动程序的注册表信息中都加入下列一个标志:

"Flags"=dword:1000

这个标志是一个位掩码,它可以和其它已经存在的"Flags"或运算。
值1000表示此驱动程序只加载一次,这样device.exe就不会把当前驱动程序加载两次了。
在包含系统HIVE的存储设备的驱动程序的注册表信息中,加入如下标志(假设是硬盘):
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]
"MountFlags"=dword:2

这个标志表示这个存储设备包含系统HIVE文件。
  按照如上所述设置后的内核就能实现永久存储注册表数据了。对于保存注册表数据的执行动作在此必须阐述清楚:
  正常情况下,CE能够保证重要的注册表数据能够从内存刷到(Flush)永久存储器上。
但是这并不能完全保证所有数据都能完整地保存而不丢失,所以要保证万无一失,
应该主动地调用RegFlushKey函数强制将内存中的数据刷到永久存储器上。
这个函数的参数只有一个,就是注册表分支。CE还增加一个注册表项(如下所示),
它的作用是每当函数RegCloseKey被调用时都自动调用RegFlushKey函数。
[HKEY_LOCAL_MACHINE\init\BootVars]
"RegistryFlags"=dword:1
  如果CE在启动过程中发现系统HIVE出现错误,它会自动删除文件并创建一个默认的系统HIVE文件,如果出现下面的注册表项,说明发生了这种事情。 [HKEY_LOCAL_MACHINE]
"RegPersisted"=dword:1

2,基于Flash的

1.在 "File Systems and Data Store" -- "Registry Storage"內,
選擇 "Hive-based Registry" .然后其它的都不用修改了
fat文件系统也不用加.

2,修改platform.reg的部分
找到下面的,修改
修改地方一:
; @CESYSGEN IF FILESYS_FSREGHIVE
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\init\BootVars]
"SYSTEMHIVE"="system.hv"
; "PROFILEDIR"="Documents and Settings" ;直接去掉了
"Start DevMgr"=dword:1 ;把0修改为1
; END HIVE BOOT SECTION
; @CESYSGEN ENDIF FILESYS_FSREGHIVE

[HKEY_LOCAL_MACHINE\init\BootVars] ;增加的地方
"DefaultUser"="default" ;增加的地方

修改地方二:
;HIVE BOOT SECTION ;自己加的,不知道有没有用
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\FlashDrv]
"DriverPath"="Drivers\\BlockDevice\\FlashDrv"
"LoadFlags"=dword:1
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000 ;自己加的

[HKEY_LOCAL_MACHINE\Drivers\BlockDevice\FlashDrv]
"Prefix"="DSK"
"Dll"="FLASHDRV.dll"
"Order"=dword:0
"Ioctl"=dword:4
"Profile"="FlashDrv"
"FriendlyName"="MS Flash Driver"
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000 ;自己加的

; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"MountFlags"=dword:2 ;11 -> 2
"Folder"="ResidentFlash"
"Name"="Microsoft Flash Disk"
"BootPhase"=dword:0
"Flags"=dword:1000 ;自己加的
;END HIVE BOOT SECTION ;自己加的,不知道有没有用

这样就能用了,
心里还有的疑问是:
微软的帮助文档说,
Set the following flag bit on each driver that is loaded during the first boot phase.
[HKEY_LOCAL_MACHINE\Drivers\...]
"Flags"=dword:1000
这个我没有理会,当然在上面有关flash的地方我还是加了,在common.reg里面很多地方都没加
但是能用.
还有,我没试上面的我加的
;HIVE BOOT SECTION
;END HIVE BOOT SECTION
本来的想法是,希望系统在加载注册表前,先加载必要的驱动,但是我觉得前面加";"分号了,就应该
屏蔽掉了,不知道到底起作用了没有,
具体在哪里设置加载自己的注册表前,应该加载哪些驱动.希望网友指教.
还有,希望网友能拿一个比较好的设置出来,偶估计自己的这个可能存在问题.

 

抱歉!评论已关闭.