永久保存到第二种思路
之前提到了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]
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
我尝试用你这种作法(使用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 才可以办到吗
NandFlash 是看不见的了,如果成功了。
用那个flag,叫做啥MountAsRoot。其他的不改,也是可以保住windows的。
[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]
对,我今天有空,找找先吧。呵呵。
呜呜,我找不到了!我原来改动的不多的。
;-----------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盘符不会出现,就可以的了。