另类方式来实现HIVE

我还是无法解决WINCE保存设置的问题,请高手赐教?
我已经使用的HIVE-BASED REGISTRY作为CE的保存选项了,打电话给研博,他们一会儿说要加一个组件,一会儿又说只要我付2000大圆,把解决方案提供给我,可怜我穷学生一个,哪来那么多钱啊?
还请高手指教!再次谢谢!
no.killer 2003-08-04 10:41
Windows CE注册表通常保存在RAM,所以是易失的。如果你想提供永久注册表,你必须在OEM适配层执行两个函数。系统使用这两个函数将注册表写道永久存储器中(WriteRegistryToOEM),并从永久存储器读取注册表(ReadRegistryFromOEM).

不过这个方法我没有用过我以前给你的贴子里有关于我解决这个问题的办法只是你没有注意罢了!

no.killer 2003-08-04 10:50
default.fdf

rootgr 2003-08-04 20:07
我已经在CE的HLEP中察看了这两个函数的用法,但怎样才能在CE启动之前把注册表值读入,在关闭CE前将注册表值写入呢?如果自己写一个组件放在CE的启动栏里的话,恐怕不行,因为这时CE已经对硬件和注册表初始化,此时读入对系统没有任何用处,而在关闭CE前如何捕捉关闭信号呢?

rootgr 2003-08-04 20:23
谢谢no.killer兄,
我手头有研华PCM3350的NK.BIN和研博x86的NK.BIN,启动他们的NK.bin,发现他们第一次都会释放出DOCUMENTS AND SETTINGS的目录,在目录下会自动生成SYSTEM.HV和USER.HV,还有一个DEFAULT的文件,但这个文件的后缀名都不一样,但并不是DEFAULT.FDF文件,他们是怎么实现的?

no.killer 2003-08-05 10:47
我说的你可能没有看明白!你可以在你的存储器上写下自己的.ini文件开机的时候执行一个应用程序这个程序读ini文件并且把它写到注册表内,这时候在你的Window目录下的Ram文件肯定被更改了,你可以同时在拷贝一个别的文件例如alreadyrun.saf到windows目录这个时候你的Ram文件里多了一个文件重新热启动计算机,由于是热启你的ram文件不会丢失并且计算机重新读注册表。这是后你的程序判断ram中是否有这个文件alreadyrun.saf如果有那么退出程序不进行重启就达到了加载注册表的任务,很简单的道理,我相信研博也是用我这个办法解决的开机后重启了计算机只是时间很短你没有注意罢了!

至于关闭以后的存储只是写那个.ini文件罢了我做的程序也是自己做的关闭按钮所以我也没有办法解决!不过以前的贴子好像有朴捉关闭按钮的办法! :lol:

rootgr 2003-08-05 11:44
非常感谢no.killer兄,我会按照您说的方案去做。

halo_x 2003-08-11 20:43
如果你是基于HIVE-BASED REGISTRY的注册表模式,只要调一下RegReflushKey就可以了

rootgr 2003-08-11 22:57
哦!在什么地方调用呢?

joyfly 2003-08-12 09:58
我没做过这些,但据我所知:
WriteRegistryToOEM的方法比较麻烦,因为它是在KERNEL运行的,也就是说,你不能通过DRIVER来访问你的存储介质(注册表存放的地方,如硬盘,CF卡,FLASH等),得自己去写硬件访问.比较麻烦,也不容易实现.

如果如halo_x 所说的,只要调一下RegReflushKey就可以了.那可以写一个驱动,在驱动里启动一个线程,定时来FLUSH注册表.

rootgr 2003-08-12 18:52
RegReflushKey只是将现有的操作影射到成相应的注册表设置,但还是在RAM中的,所以是无法实现保存的,必须使用WRITEREGISTRYTOOEM才能实现CE注册表的保存。
但关键在于如何访问CF卡?

joyfly 2003-08-12 22:36
通过PCMCIA HOST寄存器,得参考硬件手册
而且,这样访问的话,就没有文件系统的概念,有可能会破坏卡上的文件
所以非常麻烦,也不一定可行。

leo-cyl 2003-08-13 09:59
1.WriteRegistryToOEM/ReadRegistryFromOEM 只支持RAM-BASED REGISTRY。当你完成以上两函数后,调用RegReflushKey可触发WriteRegistryToOEM,完成备份。注意你的存储介质不需要文件系统。
2。HIVE-BASED REGISTRY默认将REGISTRY保存在DRAM。修改以下键值:
[HKEY_LOCAL_MACHINEinitBootVars]
"Start DevMgr"=dword:1
将把REGISTRY保存到你指定的文件系统(如硬盘,CF卡,FLASH,IPSM等)。具体查看HELP。调用RegReflushKey可自动完成备份(DRAM或你指定的文件系统)。注意你的存储介质需要完成文件系统DRIVER。

rootgr 2003-08-13 10:11
能否发个工程文件作参考?
我的设置如下:
; @CESYSGEN IF FILESYS_FSREGHIVE
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINEinitBootVars]
"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
; @CESYSGEN ENDIF FILESYS_FSREGHIVE
在FEATURECVIEW中也选择了HIVE-BASED REGISTRY。
但每次启动,注册表只会在RAM中。并没有保存到CF卡上。

leo-cyl 2003-08-13 10:43
我没做过CF-CARD的HIVE-BASED REGISTRY,因为CF的DRIVER是由DEVICE。EXE启动的,而不是FILESYS。EXE所以比较复杂。
首先,以下KEY是必须的:

; HIVE BOOT SECTION

[HKEY_LOCAL_MACHINESystemStorageManagerProfilesPCMCIAFATFS]

"MountFlags"=dword:2



[HKEY_LOCAL_MACHINEDriversBuiltInPCMCIA]

"Dll"="PCMCIA.dll"

"Order"=dword:0

"IClass"=multi_sz:"{6BEAB08A-8914-42fd-B33F-61968B9AAB32}=PCMCIA Card Services"

"NoBatteryCheck"=dword:1

"Flags"=dword:1000
; END HIVE BOOT SECTION

rootgr 2003-08-13 11:01
我将CF卡作为IDE设备来用,所以和接个硬盘没什么区别!

leo-cyl 2003-08-13 11:29
你有加这个KEY吗?
"MountFlags"=dword:2

rootgr 2003-08-13 11:54
; Storage manager settings (see common.reg for more details)
; @CESYSGEN IF FILESYS_FSREGHIVE
IF BSP_ENABLE_FSREGHIVE
[HKEY_LOCAL_MACHINESystemStorageManagerProfilesTRUEFFS_DOC]
"MountFlags"=dword:2
ENDIF BSP_ENABLE_FSREGHIVE
; @CESYSGEN ENDIF FILESYS_FSREGHIVE

rootgr 2003-08-13 11:57
是在PLATFORM.REG中的。
请教,PB的HELP上说有关的设置都在PROJECT.REG中,但我发现都在PLATFORM.REG中。
您能不能把工程文件EMAIL给我看看。
在PB的BUILD菜单中选择CLEAN,然后将整个目录压缩一下,一般只有几百K左右。
谢谢!

leo-cyl 2003-08-13 13:12
设置在PROJECT.REG和PLATFORM.REG没有太大区别。我是在IPSM上完成HIV-BAESD的,和你的不同。能告诉我你的配置吗?是什么DiskOnChip?Geode?如果是,参考下面:
; @CESYSGEN IF MSYSTEMS_DISKONCHIP_MODULES_DISKONCHIP

; HIVE BOOT SECTION

[HKEY_LOCAL_MACHINEDriversBuiltInTrueFFS]
"Index"=dword:1
"Dll"="TrueFFS.dll"
"Prefix"="DSK"
"Order"=dword:1
"Ioctl"=dword:4
"WindowBase"=dword:D0000
"IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"

; END HIVE BOOT SECTION

; HIVE BOOT SECTION

[HKEY_LOCAL_MACHINESystemStorageManagerProfilesTRUEFFS_DOC]
"Name"="DiskOnChip M-Systems"
"Folder"="DiskOnChip"
"DefaultFileSystem"="FATFS"
IF BSP_ENABLE_FSREGHIVE
"MountFlags"=dword:2
ENDIF BSP_ENABLE_FSREGHIVE

; END HIVE BOOT SECTION

; @CESYSGEN ENDIF MSYSTEMS_DISKONCHIP_MODULES_DISKONCHIP

在MSystems_DiskOnChip.reg 中将MSYSTEMS_DISKONCHIP_MODULES 改为MSYSTEMS_DISKONCHIP_MODULES_DISKONCHIP

rootgr 2003-08-13 22:28
我不是使用的DOC,是CF卡,你可以认为是硬盘,所以不能用TRUEFFS_DOC

leo-cyl 2003-08-14 09:01
[quote:97aee771b0="rootgr"]; Storage manager settings (see common.reg for more details)
; @CESYSGEN IF FILESYS_FSREGHIVE
IF BSP_ENABLE_FSREGHIVE
[HKEY_LOCAL_MACHINESystemStorageManagerProfilesTRUEFFS_DOC]
"MountFlags"=dword:2
ENDIF BSP_ENABLE_FSREGHIVE
; @CESYSGEN ENDIF FILESYS_FSREGHIVE[/quote:97aee771b0]


以上是你的回帖吧?那你为什么用TRUEFFS_DOC :?:
你的CF是通过什么总线连接的?PCI 还是 PCMCIA?确保相应的总线驱动也应该在DEVICE。EXE启动之前加载。另外PB是什么版本?

joyfly 2003-08-14 09:27
SORRY,打断你们的讨论,我觉得有必要纠正一下:
"总线驱动也应该在DEVICE。EXE启动之前加载"这是不对的.
PCI或PCMCIA的驱动也是由device.exe加载的,所以它不可能在device.exe启动之前加载.

rootgr 2003-08-14 10:39
谢谢!!

leo-cyl 2003-08-14 11:53
[quote:0f2c8ad314="joyfly"]SORRY,打断你们的讨论,我觉得有必要纠正一下:
"总线驱动也应该在DEVICE。EXE启动之前加载"这是不对的.
PCI或PCMCIA的驱动也是由device.exe加载的,所以它不可能在device.exe启动之前加载.[/quote:0f2c8ad314]

抱歉!刚才为了省事(打字太麻烦),所以用了错误的概念,但应该不影响我要表达的意思。感谢joyfly提醒!
实际上,HIVE-BASED REG 启动分二步:
1。Filesys.exe启动boot registry(即由; HIVE BOOT SECTION 开始的registry key),然后加载device.exe,并阻塞自己。
device.exe 启动boot registry中指定的drivers(这里指你的CF卡,和相关设备PCI,PCMCIA),并阻塞自己,这时Filesys.exe激活,完成system registry的加载。
2。device.exe激活,根据system registry加载其他设备,完成启动。

所以,我的意思是:在启动的第一步要保证CF卡和相关设备要被加载。否则Filesys.exe无法MOUNT system registry。

no.killer 2003-08-19 09:07
出差了这几天,有这么多的人发贴子,hehe!解决的办法找到了吗?如果有更好的办法的话最好把它贴出来一下!共同研究嘛!!

rootgr 2003-08-19 09:34
还差一点了,等完全解决了,我会公布出来的!
谢谢大家的支持!!!!!

leo-cyl 2003-08-19 09:51
其实还有其他方案的:
用RegSaveKey/RegReplaceKey也可以实现REG BACKUP。(如果是RAM-BASED REGISTRY,请用RegCopyFile/RegRestoreFile),这两个API把REG COPY 到你指定的文件中。当WINCE启动时,用RegReplaceKey恢复REGISTRY,然后做一个热启动即可。(可用kernelIoControl热启动)
以上方法我在一年前用过,效果不错,只是启动慢一些,另外BACKUP时,必须用固定的文件名。

rootgr 2003-08-19 16:35
是吗?但用这个方法时如何能获得文件的路径呢?能不能贴段代码看看!

leo-cyl 2003-08-20 09:21
在DEVICE。EXE 启动前,文件系统已经READY了,所以不必考虑文件的路径,

if (RegRestoreFile(_T("/iPSM/regbackup.bak"))){
RETAILMSG(1,(TEXT("RegRestoreFile success!
")));
Sleep(500);
ResetPocketPC();
}
else if (RegCopyFile(_T("regbackup.bak"))) {
CopyFile(_T("regbackup.bak"),_T("/iPSM/regbackup.bak"),FALSE);
DeleteFile(_T("regbackup.bak"));
RETAILMSG(1,(TEXT("RegCopyFile success!
")));
}


SignalStarted( 15);

RETAILMSG(1,(TEXT("Continue boot!
")));
return TRUE;


以上是我以前的代码,基于RAM-BASED REGISTRY。如果是HIVE-BASED请用相应的API。
[HKEY_LOCAL_MACHINEinit]
"Launch15"="RestoreReg.exe"
"Depend15"=hex:0a,00

我的程序在FILESYS。EXE启动后,DEVICE。EXE启动前加载。你可以根据实际情况调整(例如放在DEVICE。EXE启动后,以确保其他设备已经加载)

lobby 2003-08-21 09:22
请问上面的各位兄弟,通过你们说的方法,是不是已经把保存设置的
问题真正解决了?如果用hive-based Device setup如何实现呢?
谢谢

rootgr 2003-08-21 10:13
谢谢!

rootgr 2003-08-21 15:54
请问LEO大哥,能否不用写程序,而直接在PB中通过设置相应的值,达到自动保存设置呢?

leo-cyl 2003-08-21 23:49
那只有HIVE-BASED REGISTRY了,不过似乎你遇到了麻烦,而我又不太清楚你的具体情况,SORRY!我说的第二种方法是比较通用的,应该适合你。

rootgr 2003-08-22 08:26
是啊,我现在就是使用的HIVE-BASED REGISTRY,但无论我怎么修改,WINCE都不会把文件保存到CF卡上,其实我要保存的文件只有三个:SYSTEM.HV、USER.HC、和DEFAULT.MKY,这三个文件包含了WINCE下所有的设置,只要正确的设置这三个文件,在启动是把它读入注册表,我的要求也达到了。

leo-cyl 2003-08-22 08:55
我前面已经说得很清楚了:在启动的第一步要保证CF卡和相关设备要被加载。否则Filesys.exe无法MOUNT system registry。

huminan 2003-12-03 14:47
我用的是CE4.2,用flash来存储HIVE,因为我没有用外部存储器,我照着各位老大的帮助继续修改,但系统老是起不来,请各位给点建议!!!

huminan 2003-12-04 16:33
我发现当我设置"Start DevMgr"=dword:1时系统不能起来;但当我设置"Start DevMgr"=dword:0时系统能起来,为什么???

fenger33 2004-02-02 16:53
dear rootgr :
我也有这个问题,是基于HIVE-BASED REGISTRY的IDE 的CF卡
有没有完整一点的方案?
 

你可能感兴趣的:(另类方式来实现HIVE)