HIVE保存注册表的实现
--作者:赖玉平(Auly)aulyp@163.com
HIVE工作原理:
WinCE下面就两种注册表,一种是RAM based,另外就是HIVE based,缺省用的是前者,如果用前者PB会在编译的时候把common.reg和platform.reg的内容做到一个叫reginit.ini 的文件然后压缩成default.***(忘记扩展名了,有过老迹象了哈)的文件放到XIPKERNEL中去,image在起来的时候会把这个文件解压到 RAM中形成RAM based注册表,既然是RAM based那么所有的改动都会在断电后蒸发,但是你想如果你把注册表全放到磁盘(SDMMC或HDD或Flash)上WinCE怎么在没有加载你磁盘的驱动的情况下读到注册表呢?而一般情况加载磁盘的驱动程序也是要注册表的支持,这就是HIVE想到的,看它怎么做,它把注册表分成两部分(其实是三部分,但是大体还是两部分,把user.hv和system.hv 做一部分),第一部分就是叫做boot.hv的注册表,里面的东西就是一些在没有拿到保存在磁盘的注册表之前引导时需要的一些设置,这部分的注册表和 RAM based的是一样的,改了之后断电就没了,所以这部分的注册表项都是不需要改动的,需要改动的都放到第二部分就是了,这第二部分就是system.hv 和user.hv了,也就是一直提到的要放到磁盘上的注册表. 编译的时候PB会根据platform.reg和Common.reg中的标签判断哪些表项放到boot.hv中,这个标签就是;HIVE BOOT SECTION ;END BOOT SECTION,夹在这个标签之间的表项PB在编译的时候会把它们塞到boot.hv中去(boot.hv是二进制文件,要看里面到底放了哪些表项用一个 老外写的工具吧,好像叫d_readvol.exe,到google上找得到的),其他的内容会分别塞到default.hv和user.hv中去,最后会把这三个hv文件统统塞到XIPKERNEL中去,这样WinCE在引导的第一阶段就把所有的hv扔到RAM中去了,然后打开boot.hv拿到必要的 资料,这其中包括如何加载放置system.hv的磁盘的驱动,所以那些和加载这个磁盘相关的驱动要统统放到boot.hv中,比如FAT文件系统驱 动,mspart分区驱动等等,这里有一点很重要就是假如你用binfs而且device.exe在NK.bin中,那么一定在第一阶段要保证binfs 可用,否则这里就不可能为system.hv创造条件了。WinCE第一次启动时候磁盘上没有东东,这个时候WinCE会将内存中的default.hv 和user.hv复制到注册表BootVars指定的地方,default.hv往往会被重命名为system.hv,第二次启动会先检查磁盘上的hv是 不是和内存中的一致,不一致就加载磁盘上的表项。
实现:
下载WINCE IMAGE前记得格式化BINFS
1、Storage Manager 加入 FAT File System;
2、Registry Storage 加入Hive-based Registry ,默认的是RAM-based Registry;
3、修改platform.reg
;HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE/init/BootVars]
"SYSTEMHIVE"="Documents and Settings//system.hv" ;system.hv会保存到/HDD/Documents and Settings/system.hv
"PROFILEDIR"="Documents and Settings" ;user.hv会保存到/HDD/Documents and Settings/default/user.hv
"Flags"=dword:3 ; 这个应该是wince 5.0下决定在哪个阶段启动device.exe的表项
"DefaultUser"="default" ;咱们只有一个用户default,基本上就是决定user.hv的路径了
"RegistryFlags"=dword:1 ;这个就是设置注册表每次改动后自动flush到system.hv
;不过我们可以在改变注册表时,由应用来决定是否flush,这样会更好
;###########################################################################
;这个部分是binfs的注册表项,如果你不是用的binfs那么不用将它们拉到boot.hv中
[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/SMFlash]
"DriverPath"="Drivers//BlockDevice//SMFlash"
"LoadFlags"=dword:1
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000
[HKEY_LOCAL_MACHINE/Drivers/BlockDevice/SMFlash]
"Prefix"="DSK"
"Dll"="BIBDrv.dll" ;这个binfs的驱动DLL一定要在XIPKERNEL内部
"Order"=dword:0
"Ioctl"=dword:4
"Profile"="SMFlash"
"FriendlyName"="Samsung Flash Driver"
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000
; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/SMFlash]
"DefaultFileSystem"="BINFS" ;binfs的路径为/BINFS
"PartitionDriver"="mspart.dll" ;这个分区的驱动DLL一定要在XIPKERNEL内部
"AutoMount"=dword:1
"AutoPart"=dword:1
"MountFlags"=dword:11
"Folder"="ResidentFlash"
"Name"="Samsung Flash Disk"
"BootPhase"=dword:0 ;要在第一阶段加载binfs
"Flags"=dword:1000
"MountHidden"=dword:0 ;有了这个你就可以在/BINFS目录下看到所有的NK.bin的东东了
;###########################################################################
;###########################################################################
;这个部分是设置保存system.hv的磁盘的驱动程序,每个人不一样了,但是大同小异
;我这里用的是PoketStroeII15的Flash驱动,system.hv保存在第一个Flash分区上
IF BSP_POCKETSTORE
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/PocketStore]
"Prefix"="DSK"
"Dll"="ONDisk.dll" ;这个是在binfs之后加载,所以可以放在NK.bin中
"Order"=dword:1
"Profile"="PocketStore"
"IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
"BmlVolumeId"=dword:0 ; BML volume ID = 0
"BmlPartitionId"=dword:8 ; BML parition ID = PARTITION_ID_FILESYSTEM
"Index"=dword:2
"Flags"=dword:1000 ;这个flag指定这个驱动只在boot.hv中加载一次
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/PocketStore]
"DefaultFileSystem"="FATFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"AutoFormat"=dword:1
"MountAsBootable"=dword:1 ;这个是wince 5.0下指定这个分区保存system.hv的关键
"Folder"="HDD"
"Name"="NAND Drive"
"Ioctl"=dword:4
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/PocketStore/FATFS]
"EnableCacheWarm"=dword:0
ENDIF
;###########################################################################
;END HIVE BOOT SECTION
更详细,请参考《S3c2440A平台HIVE注册表+binfs的实现.htm》