倒騰了幾天,在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仍然有效.