您的位置:首页 > 其它

WINCE 注册表的存储和加载

2010-05-28 17:53 190 查看
说原理:

注册表类型分为基于对象存储的注册表和基于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

本来的想法是,希望系统在加载注册表
前,先加载必要的驱动,但是我觉得前面加";"分号了,就应该

屏蔽掉了,不知道到底起作用了没有,

具体在哪里设置加载自己的注册表前,应
该加载哪些驱动.希望网友指教.

还有,希望网友能拿一个比较好的设置出来,偶估计自己的这个可能存在问题.
http://www.cnblogs.com/Jade2009/archive/2010/01/22/1654170.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: