WINCE注册表的存储和加载

news/2024/6/29 10:04:15 标签: 存储, wince, flash, microsoft, 文档, 微软

先说原理:

注册表类型分为基于对象存储的注册表和基于HIVE的注册表,在定制内核的时候只能选择其中一种。
从理论上讲这两种注册表都能够实现永久保存注册表数据,但是采用不同的类型会影响CE的启动顺序和启动速度,
还会影响内存的使用量。我还是趋向于采用基于HIVE的注册表来实现永久保存注册表数据,这也是一个发展趋势。
在讲解之前先简单描述如果CE采用基于HIVE的注册表,那么在启动时如何加载已经保存的注册表数据:


1, nk.exe执行,启动filesys.exe。
2, filesys.exe加载引导HIVE,此时引导HIVE位于nk.bin解压之后的文件中。
3, filesys.exe启动device.exe,之后处于等待状态,等待device.exe将包含系统HIVE的文件系统和存储设备的驱动程序加载完毕。
4, 而这个文件系统和存储设备的驱动程序存在于引导HIVE中。
5, device.exe加载上述所说的文件系统驱动程序和存储设备驱动程序,使之开始工作。之后device.exe处于等待状态。
6, filesys.exe被唤醒,加载并且安装系统HIVE。之后filesys.exe处于等待状态。
7, nk.exe按照系统HIVE的信息开始执行初始化工作。其中包括加载驱动程序和启动一些应用程序。
其中加载驱动程序一般由device.exe执行,而启动应用程序由filesys.exe执行。这时device.exe和filesys.exe已经被唤醒。


  因为引导HIVE和系统HIVE肯定有重复的地方,所以可能出现重复加载了驱动程序或者重复启动了应用程序。
为此,CE允许在描述驱动程序的注册表信息中加入防止重复的标志,而应用程序可以采用事件对象来防止重复启动,
如device.exe。


下面讲述如何设置基于HIVE的注册表,分基于硬盘和基于flash的2种情况

大家也可以看微软的帮助.

情况1,基于硬盘的永久保存

在PB中加入"Hive-based Registry",如果是Geode平台,再加入BSP_ENABLE_FSREGHIVE环境变量。
打开platform.reg,找到如下信息: ; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE/init/BootVars]
"SYSTEMHIVE"="Documents and Settings//system.hv"
"PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:0
IF BSP_ENABLE_FSREGHIVE
"Start DevMgr"=dword:1
ENDIF
; END HIVE BOOT SECTION
"SYSTEMHIVE"的值为系统HIVE文件的路径。
"Start DevMgr"是一个布尔值,指示是否开始就执行设备管理器device.exe,按照CE帮助文档的说法,
只有想把系统HIVE存储在对象存储中才在此设置为0,所以一般都要设置为1。
如果是多用户,可以在上述的注册表位置下输入"DefaultUser"="",指定默认的用户名。如果是单用户系统,可以不设置。
保证将包含系统HIVE的文件系统驱动程序的注册表信息和存储设备的驱动程序的注册表信息被包含在
"; HIVE BOOT SECTION"和"; END HIVE BOOT SECTION"之间,在这两个语句之间的注册表数据全部属于引导HIVE。
假如我们将系统HIVE文件system.hv存放在硬盘上,并采用FAT文件系统。
那么就要将[HKEY_LOCAL_MACHINE/System/StorageManager/FATFS]和
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/HDProfile]移动到"; HIVE BOOT SECTION"下。


在"; HIVE BOOT SECTION"和"; END HIVE BOOT SECTION"之间的所有驱动程序的注册表信息中都加入下列一个标志:

"Flags"=dword:1000

这个标志是一个位掩码,它可以和其它已经存在的"Flags"或运算。
值1000表示此驱动程序只加载一次,这样device.exe就不会把当前驱动程序加载两次了。
在包含系统HIVE的存储设备的驱动程序的注册表信息中,加入如下标志(假设是硬盘):
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/HDProfile]
"MountFlags"=dword:2

这个标志表示这个存储设备包含系统HIVE文件。
  按照如上所述设置后的内核就能实现永久存储注册表数据了。对于保存注册表数据的执行动作在此必须阐述清楚:
  正常情况下,CE能够保证重要的注册表数据能够从内存刷到(Flush)永久存储器上。
但是这并不能完全保证所有数据都能完整地保存而不丢失,所以要保证万无一失,
应该主动地调用RegFlushKey函数强制将内存中的数据刷到永久存储器上。
这个函数的参数只有一个,就是注册表分支。CE还增加一个注册表项(如下所示),
它的作用是每当函数RegCloseKey被调用时都自动调用RegFlushKey函数。
[HKEY_LOCAL_MACHINE/init/BootVars]
"RegistryFlags"=dword:1
  如果CE在启动过程中发现系统HIVE出现错误,它会自动删除文件并创建一个默认的系统HIVE文件,如果出现下面的注册表项,说明发生了这种事情。 [HKEY_LOCAL_MACHINE]
"RegPersisted"=dword:1



2,基于Flash的

1.在 "File Systems and Data Store" -- "Registry Storage"內,
選擇 "Hive-based Registry" .然后其它的都不用修改了
fat文件系统也不用加.

2,修改platform.reg的部分
找到下面的,修改
修改地方一:
; @CESYSGEN IF FILESYS_FSREGHIVE
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE/init/BootVars]
"SYSTEMHIVE"="system.hv"
; "PROFILEDIR"="Documents and Settings" ;直接去掉了
"Start DevMgr"=dword:1 ;把0修改为1
; END HIVE BOOT SECTION
; @CESYSGEN ENDIF FILESYS_FSREGHIVE

[HKEY_LOCAL_MACHINE/init/BootVars] ;增加的地方
"DefaultUser"="default" ;增加的地方

修改地方二:
;HIVE BOOT SECTION ;自己加的,不知道有没有用
[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/FlashDrv]
"DriverPath"="Drivers//BlockDevice//FlashDrv"
"LoadFlags"=dword:1
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000 ;自己加的

[HKEY_LOCAL_MACHINE/Drivers/BlockDevice/FlashDrv]
"Prefix"="DSK"
"Dll"="FLASHDRV.dll"
"Order"=dword:0
"Ioctl"=dword:4
"Profile"="FlashDrv"
"FriendlyName"="MS Flash Driver"
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000 ;自己加的


; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDrv]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"MountFlags"=dword:2 ;11 -> 2
"Folder"="ResidentFlash"
"Name"="Microsoft Flash Disk"
"BootPhase"=dword:0
"Flags"=dword:1000 ;自己加的
;END HIVE BOOT SECTION ;自己加的,不知道有没有用

这样就能用了,
心里还有的疑问是:
微软的帮助文档说,
Set the following flag bit on each driver that is loaded during the first boot phase.
[HKEY_LOCAL_MACHINE/Drivers/...]
"Flags"=dword:1000
这个我没有理会,当然在上面有关flash的地方我还是加了,在common.reg里面很多地方都没加
但是能用.
还有,我没试上面的我加的
;HIVE BOOT SECTION
;END HIVE BOOT SECTION
本来的想法是,希望系统在加载注册表前,先加载必要的驱动,但是我觉得前面加";"分号了,就应该
屏蔽掉了,不知道到底起作用了没有,
具体在哪里设置加载自己的注册表前,应该加载哪些驱动.希望网友指教.
还有,希望网友能拿一个比较好的设置出来,偶估计自己的这个可能存在问题.


http://www.niftyadmin.cn/n/1516704.html

相关文章

C语言——第八章

这一章没有怎么仔细看,其实也很简单,记住格式就行了。等不会的时候可以翻书看一下就OK了。 到此为止,谭浩强的这本书已经看完一遍了,找到了10个左右的错误,感觉有点惊讶。后天C语言的圣经就买回来了,到时候…

es数据迁移_Elasticsearch数据备份说明

假设ES集群有三个节点:192.168.1.10192.168.1.11192.168.1.121. 创建共享目录在三个节点上创建共享目录/mnt/backup/,使三个节点的es用户都可以读写该目录。(推荐使用nfs创建共享目录)2. 修改ES配置在elasticsearch.yml中加入一行:path.repo:…

POJ-1753 Flip Game【枚举+BFS+位存储】

题目链接:http://poj.org/problem?id1753 题目大意:给你一个4x4的方格,里面放了16枚棋子,每个棋子有2面:黑或白。现在给出它们的初始状态,每次你可以翻转一个棋子,但是规定必须把它周围四个方向的同时翻转…

WinCE5.0和WinCE6.0下编译选项介绍续

目前,在国内Windows CE的开发可以说是一种Windows CE.NET 4.2、Windows CE.NET 5.0、Windows Embedded CE 6.0多版本共存的情况。由于Windows CE.NET 4.2成熟的技术、丰富的I/O设备驱动以及被大多数的开发人员所熟悉,所以目前仍是嵌入式产品开发的主流。…

python高德地图api调用实例_Python调用高德地图API实现经纬度换算、地图可视化

原标题:Python调用高德地图API实现经纬度换算、地图可视化 源 /经管人学数据分析文 /糖甜甜甜目前地图可视化的工具和函数比较多,但是在不知道相关地点经纬度的情况下,通过python调用高德地图API实现经纬度换算,并且直接在高德地图…

判定被7整除的简易方法【Martix67】

判断一个数的整除性对于某些除数来说是一件非常容易的事,比如2、3、4、5、6、8、9、10、11、12、15…… 但是对于7来说一直是一个难题,而判定是否被7整除在数字运算中又比较常用。我刚看到一种判定能否被7整除的方法,在这里写一下。 …

WINCE60下修改了PUBLIC下的源代码的快速编译方法

WINCE60下修改了PUBLIC下的源代码的快速编译方法 因为WINCE的组件都是分成一个个LIB/DLL的形式存在,所以只要把单个LIB/DLL编译更新然后再重新连接NK就可以起到快速编译NK的方法。不过由于NK里面的各个组件都是DLL的形式,这些DLL依存一些对应的LIB文件&…

flac转mp3_flac格式如何转mp3?音乐格式转换用这个方式就行了

flac是无损音频压缩编码,,其特点是无损压缩。不同于其他有损压缩编码如mp3及wma,它不会破坏任何原有的音频信息,所以可以还原音乐光盘音质。但很多音乐播放器不支持播放flac格式音乐文件。如果想播放flac格式音乐,只能…