倒腾了几天,在CE5.0上实现了CF卡通过Hive-based registry断电保存注册表,我采用的是FAT文件系统.
开门见山,先给出我的步骤:
(1)在PB的Catalog中将HIVE-based Registry加入到OS中.
(2)在platform.reg中添加如下注册表字段:
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\init\BootVars]
"SYSTEMHIVE"="Documents and Settings\\system.hv"
"PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:1
"Registryflags"=dword:1
[HKEY_LOCAL_MACHINE\init\BootVars]
"DefaultUser"="default"
[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
"FriendlyName"="FAT FileSystem"
"Dll"="fatfsd.dll"
"Flags"=dword:00000064
"Paging"=dword:1
"EnableCache"=dword:1
"CacheSize"=dword:0
"Util"="fatutil.dll"
"CacheDll"="diskcache.dll"
[HKEY_LOCAL_MACHINE\Drivers\PCMCIA\ATADisk]
"Dll"="ATADISK.DLL"
"Prefix"="DSK"
"Ioctl"=dword:4
"Profile"="PCMCIA"
; Indicate we are a power manageable interface and a storage driver
"IClass"=multi_sz:"{8DD679CE-8AB4-43c8-A14A-EA4963FAA715}","{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
[HKEY_LOCAL_MACHINE\Drivers\PCMCIA\Detect\50]
"Dll"="ATADISK.DLL"
"Entry"="DetectATADisk"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]
"MountAsRoot"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]
"MountAsBootable"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]
"Name"="IDE Hard Disk Drive"
"Folder"="hard disk"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile\FATFS]
"EnableCacheWarm"=dword:0
; END HIVE BOOT SECTION
接下来分析一下其中的原理.wince下的注册表分为两部分:boot.hv和system.hv.前者是启动时的注册表项,后者是系统注册表项.所谓的HIVE注册表就是先加载boot.hv,把注册表保存所在的存储驱动和文件系统先加载;然后再加载system.hv,也就是从磁盘上去读系统的注册表项.在启动时加载boot.hv的标签就是;HIVE BOOT SECTION 和;END BOOT SECTION.
在[HKEY_LOCAL_MACHINE\init\BootVars]中"SYSTEMHIVE"是指保存system.hv的路径,"Registryflags"=dword:1是为了在修改了注册表后自动刷新从而保存.因为HIVE注册表也是在内存中运行的,不同的是启动的时候会从磁盘上去读改动的表项,所以你做的的注册表改动也是在内存中做的,这个时候如果你不去将内存中的数值保存到磁盘上,那么这些改动还是会丢失的.当然也可以编程实现(调用RegflushKey).在实现HIVE过程中,要实现两部分:存储HIVE介质的驱动以及文件系统的相应项.由于我的保存是在CF卡(相当于硬盘)上实现的,所以把platform.reg里的ATADisk驱动和存储管理中StorageManager\Profiles\HDProfile相关项都加进去,接着把System\StorageManager\FATFS加入,完成加载FAT文件系统.
收获的几点:1.实现HIVE配置文件改动包括三部分:(1)bootvars表项,作用是保存的位置,多用户以及自动刷新机制.(2)存储介质的驱动,在我的情况下也就是硬盘的驱动项;(3)文件系统的加载(FATFS).
2.看到一些文章在存储驱动中添加"flags"=dword:1000,作用是只加载一次.
3. "MountAsBootable"=dword:1 这句等价于4.2下的mountflag=dword:2
这句话用来指明注册表保存在该磁盘驱动系统下.我验证了wince5.0下mountflag=dword:2仍然有效.