永久儲存到第二種思路
之前提到了ROM-only File System可以將系統根目錄設定到ResidentFlash到辦法, 從而實現永久儲存的目的,這主要是為了方便第三方軟體的安裝, 安裝到windows目錄的檔案中重啟之後不會消失。
實際上不少產品還是RAM and ROM File System的, 那麼怎麼解決永久儲存的問題? 下面是解決辦法。
1. 修改ShellFolder. 核心啟動時候,filesys.exe會根據initobj.dat來建立一些系統目錄和檔案, 預設是在根目錄,也就是RAM盤中建立Desktop, my document...這些目錄。explorer.exe程式會根據註冊表配置指定的Shell Folders,預設的指向上面RAM盤下filesys.exe建立的這些目錄。因此, 我們可以修改註冊表來重新導向這些路徑,指向flash到目錄。 如下是一個樣本:
[HKEY_LOCAL_MACHINE/System/Explorer/Shell Folders]
"My Documents"="//SDMMC//My Documents"
"Desktop"="//ResidentFlash//Desktop"
"Application Data"="//ResidentFlash//Application Data"
"Favorites"="//ResidentFlash//Favorites"
"Programs"="//ResidentFlash//Programs"
這樣,重啟之後, 這些目錄下面的內容就不會丟失。
2. windows目錄。 這個是最重要的, 因為一些dll必須放在這個目錄或者根目錄下面。可是每次重啟後, 都會丟失。 WinCE又沒有環境變數這樣的概念。 安裝檔案cab一般都把檔案放到windows目錄下面。 如何解決? 其實, LoadLibrary時候會搜尋幾個路徑, 除了上面提到windows和根目錄, 還有“目前的目錄”, 可以拷貝dll到目前的目錄。 此外, 註冊表還提供了一個SystemPath到配置, 很類似環境變數, 在註冊表可以指定一個或多個系統路徑。查看這篇msdn:[url]http://msdn.microsoft.com/en-us/library/ms886736.aspx[/url]
If no file name extension is specified in the lpLibFileName parameter, the default library extension .dll is appended. However, the file name string can include a trailing point character (.) to indicate that the module name has no extension.
A search path to the executable module cannot be specified.
Unless the full path to the module is specified, Windows CE searches the following path for the module:
The absolute path specified by the lpLibFileName parameter
The .exe launch directory
The Windows directory
ROM DLL files
An OEM-specified search path
The following registry subkey specifies a search path to use with LoadLibrary and CreateProcess:
HKEY_LOCAL_MACHINE/Loader SystemPath=multi_sz://path1// //path2//The path is only searched if the path of the file being looked for is not explicitly specified.
The total length of the SystemPath value must not exceed 260 characters. If it does, the path is ignored.
A change to the SystemPath key does not take effect until a Windows CE–based device is reset.
所以,我們可以指定系統路徑到ResidentFlash到某個目錄。補充:可以使用WinCE cab manager工具來處理, 提取檔案,修改安裝路徑等。 有空試試。
3. 註冊表的永久儲存。 這個藉由hive註冊表就可以實現。 hive技術把註冊表分成了3個部分, boot 和 其他。 boot部分是不需要修改的用於核心啟動的, 其他部分system.hv和user.hv可以放在ResidentFlash裡面。註冊表可以恢複為出廠狀態。filesys.exe在啟動過程中會透過OEMIoCtls來詢問是否恢複出廠狀態。
總結: 使用RAM and ROM File System也可以到達永久儲存的目的。 只是dll可能需要手動拷貝轉移。 但好處是保持系統“乾淨”, 穩定。 裝錯軟體比較不害怕。 而註冊表也可以恢複為出廠狀態。
原文地址[url]http://chenyq2008.spaces.live.com/blog/cns!F73164AC8D0D8D50!245.entry[/url]
gooogleman 發表於 2009-11-27 16:48
RAM and ROM File System vs ROM-only File System
【RAM and ROM File System vs ROM-only File System】
二者都是檔案系統driver。都有能力讀取ROM檔案系統。 區別在於:前者除了能夠讀取ROM盤之外,他還構造了一個RAM盤。(因為file system很容易混淆,我稱呼ROM盤和RAM盤) 。
RAM盤指什麼呢? 就是在ram空間虛擬磁碟。 先說些廢話:ce起來後會把所有可以用的記憶體分割成為2個空間,儲存記憶體和程式記憶體, 預設的是1:1的分配, 你可以在config.bib裡面設定FSRAMPERCENT來改變分配比例。 程式記憶體就是程式可用記憶體, 就是正常理解的普通意義的記憶體。而儲存記憶體:Object Store, 它包括了註冊表, 屬性資料庫和上面提到的RAM盤。
ROM盤指什麼呢? 首先肯定的是, 它指nk.bin。 其次, 它究竟指的是在flash上的nk.bin還是被載入到記憶體執行的nk.bin呢?經過測試推理, 應該指的是載入到記憶體裡面的nk.bin。核心啟動後要找到檔案執行,首先執行nk.exe,這個算特例, 因為鏡像進入點就是它, nk.exe要載入filesys.exe,而且filesys.exe需要獲得註冊表, 這個時候沒有初始化磁碟,而且初始化磁碟需要註冊表, 所以只有從記憶體的ROM盤獲得,這是一個論據。 另外還做了個測試, 從電腦經過usb或者網線下載nk.bin到裝置運行,
下載後並不燒寫到磁碟,而是直接運行,這樣測試是成功的, 說明ROM盤的確是指的記憶體裡面鏡像。
回到RAM and ROM File System vs ROM-only File System的話題。使用前者的話, 系統的根目錄就是前面提到的RAM盤, 而外部磁碟如:/ResidentFlash,/Storage Card這些,就成為一個獨立的目錄掛載在根目錄下面, ROM盤的內容則安置在/windows目錄, 如果xip,你甚至還可以看到/binfs代表的nk.bin所在的磁碟。 除了外部磁碟, 對其他目錄的寫和更改都是發生在記憶體, 所以, 重啟系統後全部消失了。這產生一個的問題:第三方軟體怎麼永久安裝?
因為第三方軟體常常儲存東西在windows目錄下面,也會修改註冊表。重啟後就不能使用了。這一點完全背離了使用者習慣的使用經驗。(微軟考慮是裝置是永不關機的,所以早期的ppc是沒有關機功能的。) 在catalog中加入ROM-only File System組件, 並且修改註冊表的MountFlags或者MountAsRoot就可以使用ROM-only File System功能,如果之前已有的項目,重新rebuild時候記得勾上clear。 它將一個磁碟當成系統的根目錄。但是對於wince5.0會存在一個困擾,
就是同步功能不能工作了。根據資料,Wince6.0和mobile都提供了一個File replacition filter driver(fsreplxfilt.dll)能解決這個問題。我分析推測,因為同步是需要同步到Object Store, 這個驅動提供Object Store介面的處理。關於File replacition的描述的連結地址在這:[url]http://msdn.microsoft.com/en-us/library/aa911937.aspx[/url]
gooogleman 發表於 2009-11-27 16:49
我自己也做過,不過沒有寫文檔,現在都不太記得了,案頭的東西都不會丟的。
popzone 發表於 2009-11-27 17:07
學習了
gongyue1983 發表於 2009-11-28 14:50
gooogleman
我嘗試用你這種作法(使用RAM and ROM File System),成功一部分
[HKEY_LOCAL_MACHINE/System/Explorer/Shell Folders]
"Programs Files"="//NandFlash//Programs Files"
"Windows"="//NandFlash//Windows"
[HKEY_LOCAL_MACHINE/Loader]
SystemPath=multi_sz:"//NandFlash//Windows"
那麼我現在開機,device 下面如下的檔案夾:
/Programs Files
/Windows
/NandFlash
/NandFlash/Programs Files
/NandFlash/Windows
其中/Windows,存有所有的系統檔案。Programs Files 被映射到/NandFlash/Programs Files
現在這麼多的目錄,我看得還是有些彆扭
能夠有辦法弄成這樣嗎:
就只有
/Programs Files
/Windows
然後/Programs Files 實際對應/NandFlash/Programs Files
/Windows 實際對應 /NandFlash/Windows
難道只有用Rom-only File System 才可以辦到嗎
gooogleman 發表於 2009-11-28 18:35
NandFlash 是看不見的了,如果成功了。
Walle 發表於 2009-11-30 10:13
用那個flag,叫做啥MountAsRoot。其他的不改,也是可以保住windows的。
gooogleman 發表於 2009-11-30 10:22
[quote]用那個flag,叫做啥MountAsRoot。其他的不改,也是可以保住windows的。
[size=2][color=#999999]Walle 發表於 2009-11-30 10:13[/color] [url=http://www.armce.com/bbs/redirect.php?goto=findpost&pid=8262&ptid=830][img]http://www.armce.com/bbs/images/common/back.gif[/img][/url][/size][/quote]
對,我今天有空,找找先吧。呵呵。
gooogleman 發表於 2009-11-30 11:01
嗚嗚,我找不到了!我原來改動的不多的。
gooogleman 發表於 2009-11-30 11:04
;-----------HIVE BEGIN-NEW------------------
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE/init/BootVars]
"SYSTEMHIVE"="Documents and Settings//system.hv"
"Start DevMgr"=dword:1
"RegistryFlags"=dword:1
"DefaultUser"="default"
"Flags"=dword:1
[HKEY_LOCAL_MACHINE/init/BootVars]
"DefaultUser"="default"
[HKEY_LOCAL_MACHINE/Drivers/BlockDevice/SMFLASH]
"Prefix"="DSK"
"Dll"="smflash.dll"
"Order"=dword:0
"Ioctl"=dword:4
"Profile"="SMFLASH"
"FriendlyName"="MS Flash Driver"
"MountFlags"=dword:11
"BootPhase"=dword:1
"Flags"=dword:1000
[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/SMFLASH]
"DriverPath"="Drivers//BlockDevice//SMFLASH"
"LoadFlags"=dword:1
"MountFlags"=dword:11
"BootPhase"=dword:1
"Flags"=dword:1000
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/SMFLASH]
"DefaultFileSystem"="FATFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"AutoFormat"=dword:1
"Folder"="NandFlash"
"Name"="Microsoft Flash Disk"
"BootPhase"=dword:0
"Flags"=dword:1000
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/SMFLASH/FATFS]
"FriendlyName"="FAT FileSystem"
"Dll"="fatfsd.dll"
"Flags"=dword:00280014
"Paging"=dword:1
"CacheSize"=dword:0
"EnableCacheWarm"=dword:0
"EnableCache"=dword:1
; "MountFlags"=dword:2
[color=Red]; mounts the first FATFS partition on a storage device
"MountAsRoot"=dword:1
"MountAsBootable"=dword:1
"MountPermanent"=dword:1[/color]
; END HIVE BOOT SECTION
;---------HIVE END------------------
這是我成功的註冊表,我記得選rom檔案系統,nand flash盤符不會出現,就可以的了。