注册 | 登录 | RSS订阅 | BLOG | 站内留言 | 欢迎你投稿

分类: ‘教程精华’

Platform Builder之旅(五)

2008年3月2日 没有留言

Platform Builder之旅(五)

作者:付林林

  随着CE的发展,对象存储(Object Store)的作用越来越小,而大容量的永久存储设备被越来越多地采用,这一章将针对CE的文件系统阐述相关的知识,让PB开发者除了能够加入对永久存储设备的支持,还能做一些优化。记得在以前讲过的文章中提到了如何在PB中向定制的内核加入对硬盘、光驱的支持(包括ATA设备驱动和各种文件系统),在这里就不再重复了。
  CE提供了三种文件系统,基于ROM的文件系统、基于RAM的文件系统、FAT文件系统。FAT文件系统使用的范围最广,能够应用在ATA设备、Flash存储设备、SRAM存储设备上,另外CE还允许开发者自己编写并注册一套文件系统,只要接口符合Win32文件系统API即可。

CD/UDFS 文件系统

  这两种文件系统被用于读取CD、DVD等。除了通过在PB的“catalog”中加入这个文件系统外,还可以在PB中添加SYSGEN_UDFS环境变量来实现。CDFS和UDFS在注册表中的注册信息如下:

; Default values for udfs. These can be overridden per profile.
[HKEY_LOCAL_MACHINE\System\StorageManager\UDFS]
"FriendlyName"="CDFS/UDFS FileSystem"
"Dll"="udfs.dll"
"Paging"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\CDProfile]
"Name"="IDE CDROM/DVD Drive"
"Folder"="CDROM Drive"
"DefaultFileSystem"="UDFS"
"PartitionDriver"=""      

  上面注册表信息在文件common.reg中。注册表数据是从上至下有效,也就是说下面的数据可以覆盖上面的数据。从注册表数据可以看出udfs.dll包含了UDFS文件系统的驱动程序,CDROM的驱动器名为”CDROM Drive”,采用的文件系统为UDFS,没有分区驱动程序。如果我们要访问CDROM的目录或者文件就要在名字前加”\CDROM Driver\”。注意,可能你的common.reg文件中的数据在”Flolder”处不同于上面,比如为"Folder"=LOC_STORE_CD_FOLDER,那么你可以直接按照上面数据更改,或者在*.str文件中查找LOC_STORE_CD_FOLDER,找到这个ID对应的字符串再更改(查找到的文件可能很多,应查找以本国家码为目录名的目录)。

FAT文件系统

  除了安全性外,FAT文件系统是一个很优秀的文件系统,很适合在嵌入式设备中使用。CE也把FAT作为外部存储设备的通用文件系统。添加FAT文件系统的环境变量为SYSGEN_FATFS。随便列出CE提供的操作FAT文件系统的函数:

DefragVolume         碎块整理,在碎块整理前先进行磁盘扫描。
DefragVolumeUI       同上,但是包含一个选项对话框。
FormatVolume         按要求格式化分区。
FormatVolumeUI       同上,但是包含一个操作对话框。
ScanVolume           扫描一个分区的FAT和目录。
ScanVolumeUI         同上,但是包含一个操作对话框。

FAT文件系统在注册表中的注册信息如下:

; Default values for fatfs.  These can be overridden per profile
[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
"FriendlyName"="FAT FileSystem"
"Dll"="fatfsd.dll"
"Flags"=dword:00000024
"Paging"=dword:1
"CacheSize"=dword:0

从注册表数据可以看出fatfsd.dll包含了FAT文件系统的驱动程序。对”Flags”值的描述如下:
 

标志 描述
FATFS_Update_ACCESS 0×00000001 更新访问时间
FATFS_DISABLE_AUTOSCAN 0×00000004 不能自动调用ScanVolume
FATFS_VERIFY_WRITES 0×00000008 检验所有写操作
FATFS_ENABLE_BACKUP_FAT 0×00000010 备份FAT表
FATFS_FORCE_WRITETHROUGH 0×00000020 让系统可以直接将任何缓冲区中的数据写到磁盘上,这样系统将加快写数据到磁盘的速度
FATFS_DISABLE_AUTOFORMAT 0×00000040 禁止自动格式化未格式化的分区
FATFS_DISABLE_COMPCHECK 0×00000080 禁止自动检测压缩分区

  “Paging”用于指定是否能够分页,值为1可以分页,0不能分页。“CacheSize”用于指定FAT文件系统缓冲区大小。具体的值是用16进制数表示的扇区数量。假如”CacheSize”的值为400,那么用于FAT缓冲的字节数为1024 * 512 = 512KB。
  存储管理器默认的文件系统是FAT文件系统,所以硬盘、USB、PCMCIA等存储设备的注册表信息默认都没有指定文件系统。

文件系统过滤器

  文件系统过滤器是一个DLL。存储管理器在调用文件系统API之前先调用文件系统过滤器的过滤函数,通过过滤函数能够实现对文件数据的加密、解密、压缩甚至扫描文件是否存在病毒。实现文件系统过滤器的步骤是先编写DLL,CE提供了例子程序,位于%_WINCEROOT%\Public\Common\OAK\Drivers\FSD下。添加代码之后再修改注册表数据。注册表位置如下:

  1. HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\ProfileName\FileSystem\Filters
  2. HKEY_LOCAL_MACHINE\System\StorageManager\FileSystem\Filters
  3. HKEY_LOCAL_MACHINE\System\StorageManager\Filters

注册表键及其键值例子如下:

"Dll" := "fsdspy.dll" ////DLL名称
order = 0 ////顺序

  这里ProfileName是指Profile的名称,比如HDProfile。FileSystem是指具体的文件系统,如FATFS, UDFS, RELFSD。数字1指出的文件系统过滤器对指定存储硬件的文件系统有效;数字2指出的文件系统过滤器对指定的文件系统有效;数字3为所有文件系统多有效。

存储管理器

  存储管理器 (Storage Manager) 是 Windows CE .NET 的新功能,主要管理存储设备驱动程序、文件系统驱动程序、分区驱动程序、文件系统过滤器。存储管理器根据注册表数据来加载需要的模块。具体注册表数据如下:

[HKEY_LOCAL_MACHINE\System\StorageManager]
"Dll"="fsdmgr.dll"
"PNPUnloadDelay"=dword:1000

  fsdmgr.dll包含存储管理器的代码。”PNPUnloadDelay”是指存储管理器在接收到即插即用设备的卸载通知后的延时时间。具体存储管理器需要管理的存储设备的注册表信息在HKEY_LOCAL_MACHINE\System\StorageManager\Profiles下。例如硬盘的注册表信息如下:

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]
"Name"="IDE Hard Disk Drive"
"Folder"="Hard Disk"
"AutoMount"=dword:1
"AutoPart"=dword:0
"AutoFormat"=dword:0
"MountFlags"=dword:0
"FileSystem"="fatfsd.dll"
"PartitionDriver"="mspart.dll"

  “Name”指名称;”Folder”指目录名,可以在此更改目录名称;”AutoMount”指如果检测到分区后就自动安装文件系统;”AutoPart”指如果没有分区则自动将最大可用空间划分成一个分区;”AutoFormat”指如果没有格式化则自动格式化;”FileSystem”指定这个存储设备采用的文件系统,如果不指定就采用默认的文件系统;”PartitionDriver”指定分区驱动程序;”MountFlags”指文件系统如何被安装。值为1指定一个隐藏文件系统,如果文件系统被隐藏,那么这个文件系统将不会被查找文件的API发现,但是如果指定文件的绝对路径,还是可以访问的。值为2指定当前文件系统能够包含系统注册表。一个存储设备第一个分区将包含基于HIVE的系统注册表(关于基于HIVE的注册表见以前讲过的文章)。值为4指定这个文件系统作为整个文件系统的根(\),这里要说明一下,CE默认对象存储作为整个文件系统的根(\),当在根下放置一个文件时,例如\a.dat,这个文件实际存放在对象存储中。如果指定其它文件系统作为根,那么文件将存放在这个文件系统所在的存储设备中。值为8指定当指定值为4时隐藏ROM。

作者: 分类: 分类:其他 标签: 关键词:

Platform Builder之旅(四)

2008年3月2日 没有留言

Platform Builder之旅(四)

作者:付林林

  本篇文章是对前面讲过的关于PB的系列文章做一些补充,因为PB包含的知识面太广也太杂,所以针对一些杂项归纳在一起写成这一篇文章。当然一篇文章绝不可能包罗万象,有时间我会陆续写出来。

  • 【Windows CE安装目录】
    Windows CE.NET v4.1默认安装路径为C:\wince410。其子目录名及目录包含内容如下:
    Others 包含ATL、MFC运行时文件等。
    Platform 包含所有BSP子目录。每个目录包含BSP文件。
    Private 包含大多数CE公开的源码
    Public 包含大多数SDK文件、配置文件、编译工具。
    SDK 包含PB使用的工具
    public目录下一些子目录名及包含内容如下:
    Common 核心操作系统模块
    Datasync 同步数据传送模块
    Dcom DCOM模块
    DirectX directx、DVD-VIDEO模块
    IE IE模块
    NetCF .NET框架模块
    RDP 远程桌面模块
    Servers HTTP服务扩展模块
    Script JavaScript和VBScript脚本模块
    Speech SAPI模块
    Viewers FileView模块
     
  • 【build options】
    PB菜单"Platform"-"Settings"中常见的编译选项。
    Enable CE Target Control Support: 支持对实际平台的控制。可以执行 CESH 命令。
    Enable Event Tracking During Boot:在引导过程中支持事件跟踪。
    Enable Full Kernel Mode: 支持全内核模式。全内核模式参见配置文件。
    Enable Kernel Debugger: 允许调试内核。
    Enable KITL: KITL(内核独立传输层)用于在开发平台和实际平台之间相互通信。
    Enable Profiling: 能够评测内核的性能。评测内核性能的工具在以前讲过。
     
  • 【Object Icon Types】
    Object Icon是指PB中"Workspace"和"Catalog"列出的对象对应的图标。当定制了平台后,如果在"Workspace"中删除某些特征时,PB很可能弹出对话框说明此特征无法删除。本节将讲述其中原因,之前要介绍"Workspace"-"FeatureView"中相关图标。

    特征组 锚定特征 非锚定特征

    1、把一个特征组缩减成一个特征叫Resolve(分解)。点击菜单"platform"-"resolve feature(s)",弹出一个对话框显示整个CE平台所有能够分解的特征组,可以在每一个特征组中选择单个特征。比如显卡驱动组,当从PB的"catalog"中加入显示驱动时,即使加入一个驱动,PB也会在"FeatureView"显示一个特征组。通过Resolve可以任意选择一个需要的显卡驱动。
    2、锚定特征。在PB创建一个CE平台时,有一些特征默认被加上锚定特征(anchor feature)。用户从PB"catalog"中选择特征加到左边项目里时,这个加入的特征被自动加上锚定特征。同时PB将检查CE平台中的所有特征是否与新加入的特征冲突,然后根据cesysgen.bat中包含的从属规则,将和用户选择的特征相关的特征加到项目里。由PB根据从属规则带到项目里的特征是非锚定特征(非用户选择)。
    3、查看特征从属关系。通过右键菜单"feature dependencies"选项来查看指定特征的从属关系。"Depends on"表明当前特征需要哪些其它特征,"Dependency of" 表明哪些特征需要当前特征。
    4、每次从定制的CE平台中删除或者加入特征,PB都会在执行删除或者添加特征后重新整理平台的所有特征。在"Output"窗口中可以看到平台所有增加的非锚定特征。
    5、删除特征:锚定特征可以直接删除,而非锚定特征必须先删除它的父特征(父特征在加入到平台时将子特征带进来)后才能被删除。另外锚定特征也可能和另一个锚定特征属于从属关系。所以锚定特征也可能不允许被直接删除。
    通过以上5点读者一定会了解为什么有些特征不能被直接删除了。
     

  • 【cec文件】
    .cec文件是目录特征文件。这个文件用于将自定义的目录特征导入到PB的"catalog"中。适合于将编写的驱动程序、BSP等给其它开发商使用,开发商只需加载cec文件后就能够将驱动、BSP等加入到自己的平台上。用记事本就可以打开查看.cec文件的内容。一般编写.cec文件采用PB的工具"cec editor",单击PB菜单"tools"-"cec editor",弹出一个窗口,窗口标题为"platform Builder CEC Editor"。

    1、编写.cec文件:假如我们要加入一个驱动程序,这个驱动程序包含两个文件,一个驱动文件mydll.dll,另一个驱动注册信息mydll.reg。单击"cec editor"的"create a new cec file"按钮。在新窗口左边树型控件中"catalog"项位置单击右键,在弹出的菜单中单击"insert feature grout…",在弹出的对话框"insert feature group"的"name"中输入特征名字例如"mydll",带"*"的必须填写,其它可以不添。在窗口左边树型控件中"mydll"项位置单击右键,在弹出的菜单中单击"insert feature",在弹出的对话框的"name"中再次输入"mydll"。接着在窗口左边树型控件中"mydll"项位置单击右键,在弹出的菜单中单击"insert build method",在弹出的对话框中选择支持的CPU类型。在此对话框中的"Step"中共有12个选项,将PB编译平台的过程分为四个部分,每个部分又加入"Pre"和"Post"表示此前和此后。这四个部分分别为CESYSGEN(执行cesysgen.bat过程)、BSP(编译BSP等源码文件的过程)、BuildRel(复制文件的过程)、MakeImg(制作镜像文件的过程)。按照我举的例子,我只需复制这两个文件到%_FLATRELEASEDIR%中,所以在MakeImg之前执行即可,选择"PreMakeImg"。在窗口左边树型控件中"PreMakeImg"项位置单击右键,在弹出的菜单中单击"insert action"-"copy",在弹出的对话框中指定源文件路径和目的路径。目的路径可以输入"$(_FLATRELEASEDIR)"。因为我们有两个文件,所以要重复操作一遍,将另一个文件也复制过去。最后保存。
    2、导入到PB的"catalog"中:单击工具栏上"add the cec file to the catalog"按钮将此cec文件导入到"catalog"中。
    3、删除.cec文件:如果加入到"catalog"后,单击PB菜单"File"-"Manage Catalog Feature",找到你的cec文件,单击"remove"。
     

  • 【loadcepc.exe】
    loadcepc.exe是一个MS-DOS程序,它是一种Boot Loader。Boot Loader的主要工作是加载CE平台(nk.bin),将nk.bin解压后的所有文件加载到内存,然后将CPU的控制权交给CE内核,CE内核执行初始化工作,运行nk.exe实现操作系统内核功能、运行device.exe管理常用的设备驱动程序、运行filesys.exe加载文件系统、运行gwes.exe管理图形窗口事件子系统等等。采用x86 CPU的硬件系统共有两种启动模式,一种是采用BIOS(基本输入输出系统)实现硬件的检测和初始化,之后启动MS-DOS操作系统,运行loadcepc.exe加载nk.bin。另一种方法是采用The x86 ROM boot loader (romboot),它是一个很小的引导程序,有256KB大小。可以将它存放到Flash/EEPROM中替换BIOS程序,它能够实现硬件的检测和初始化,在这之后如果系统采用硬盘等IDE接口存储设备,那么romboot会自动寻找活动分区上的nk.bin文件并加载。romboot的优点是检测速度和加载速度都很快,但是在支持的硬件系统方面不如BIOS全面。
      loadcepc.exe支持通过并口、串口、网卡从开发机上下载nk.bin文件。在loadcepc后需要指定要加载的.bin文件的文件名,如果为nk.bin,那么可以不指定文件名,如果不是nk.bin,那么必须指定文件名,例如"loadcepc abc.bin"。下面简单介绍几个常见的参数:
    /B:指定串口的波特率。例如 /B:19200
        /C:指定串口的端口。1指"COM1:",2指"COM2:"。  例如 /C:1
        /D:指定显示分辨率。0指320 x 200,1指480 x 240,等等。
        /E:指定网卡IO地址和IRQ。例如/e:300:5
        /L:指定显示分辨率和色深。它需要指定具体的分辨率,所以能够指定不标准的分辨率。例如/l:768x576x8,
        表示分辨率为768 x 576,颜色位数为8位。
        /P:指定使用并口传递数据。
        /Q:指定使用串口传递数据。
        /V:指定当loadcepc加载时添加状态信息。        
  • 【调试平台和运行程序】
    要调试平台,先要配置远程连接。单击PB菜单"Target"-"Configure Remote Connection",在弹出的菜单中将"Download"和"kernel"下拉框都设置为"Emulator",单击"Download"后面的"Configure",在弹出的菜单中将"Memory(MB)"设置为64MB,因为前面我们设置了"IMGRAM64"。分辨率设置为800×600。退出"Configure Remote Connection"后单击"Target"-"Download/Initialize"将nk.bin下载到模拟器上执行。如果向定制的平台添加或者删除特征后,当执行"Build Platform"时,PB不会全部重新编译,而是将修改的部分重新编译。        要在定制的CE平台上运行应用程序或者DLL,先要将EXE或者DLL复制到%_FLATRELEASEDIR%中,再单击PB菜单上"Target"-"Run Programs",在程序列表中找到指定的EXE文件,再单击"Run",在模拟器上就可以看到你所运行的应用程序了。因为EVC附带的模拟器不支持中文,所以有些应用程序需要到PB的模拟器上运行。CE的帮助文档中介绍了如何在PB的模拟器上对应用程序设置断点进行调试,但是我没实验成功。另外凡是基于x86指令集编译的EXE、DLL都可以在模拟器上运行,除非EXE、DLL包含的功能模拟器无法模拟(模拟器的限制在我以前的文章中有说明)。
作者: 分类: 分类:其他 标签: 关键词:

Platform Builder之旅(三)

2008年3月2日 没有留言

Platform Builder之旅(三)

作者:付林林

  这篇文章主要讲解PB的配置文件。从用途方面分析,PB包含两种配置文件。分别是源码配置文件和镜像配置文件。下面分别讲解这两种配置文件。

一、源码配置文件
  源码配置文件用于编译源码时使用。这里的源码是指Windows CE公开的源码,如驱动程序、系统应用程序等。PB在编译平台时将这些公开的源码即时编译并将编译链接后的文件复制到平台工程子目录里。记得前面讲过PB在开始编译时调用cebuild.bat批处理文件,cebuild.bat执行的一个步骤是针对_DEPTREES变量指定的所有目录执行build.exe和sysgen.bat。build.exe在编译源码文件时会寻找当前目录下存放的源码配置文件,根据配置文件的信息来编译和链接,产生EXE、DLL、LIB文件。CE的源码文件所在的目录中都包含了相应的配置文件,这些配置文件只对当前目录或者子目录的源码有效,具体分为三种:

  • DIRS文件:文件内容和解释如下:
    DIRS:指定哪个子目录的源码要被编译
    DIRS_CE:只有为CE编写的源码才被编译
    OPTIONAL_DIRS:指定可选的目录(很少使用这个选项),可以只编译指定目录而不是全部编译。
  • SOURCES文件:通过宏定义来指定编译和链接涉及到的文件,文件内容和解释如下:
    TARGETNAME:指定编译链接产生的主文件名
    TARGETTYPE:指定编译链接产生的文件的类型(决定了扩展名)。文件共分三种:.lib(LIBRARY)和.dll(DYNLINK)和.exe(PROGRAM)。
    TARGETLIBS:定义.lib链接文件,链接时需要这个文件。
    SOURCES:源码文件。包含扩展名为*.c或*.h 或*.cpp的文件。
    EXEENTRY:.exe文件的执行代码入口点。
    sources.cmn文件是通用的SOURCES文件。在这个文件中可以指定作用于所有源码文件的配置选项。
  • MAKEFILE文件:包含默认的编译和链接选项
    整个编译和链接过程:build.exe收集编译和链接需要的数据(源码文件、链接文件、编译和链接选项)产生一系列的内部环境变量,然后调用nmake.exe,nmake.exe根据内部环境变量执行编译、链接,最后产生最终文件(*.lib *.exe *.dll)。
     

二、镜像配置文件:
  镜像配置文件用于在制作CE镜像文件时使用。CE的镜像文件扩展名为.bin。制作镜像工具romimage.exe除了能够产生.bin文件外,还能够产生.abx和.sre文件。整个镜像的制作过程由makeimg.exe控制,它调用cenlscmp.exe、fmerge.exe、res2.exe、txt2ucde.exe、regcomp.exe、romimage.exe等。这些工具大部分在前面已经介绍过了。镜像配置文件类型有.bib、.reg、.db、.dat、.str。如果主文件名为Common,表示是通用的配置文件。如果主文件名为Platform,表示是某一个BSP的配置文件。如果主文件名是Project,表示是定制的一个平台的配置文件。在PB中修改配置文件前如果没有把握最好先做好备份。

.bib(Binary image builder)

定义包含在内核镜像中的文件和模块的名称、加载位置。主要的bib文件有Common.bib,Config.bib, Project.bib, Platform.bib等。.bib文件内部分为几个部分:

【MEMORY】用于定义有效的物理内存块,在此将整个RAM分为几个部分。
格式:    名称 首地址 大小 内存类型
名称:    内存区域的唯一名称(RESERVE是预定义名称,可以用多次,表示此区域保留)
首地址:  内存区域的首地址(十六进制表示)
大小:    内存区域的大小(十六进制表示)
内存类型:分为三种。
RAM:     运行所有进程的内存区域(整个区域必须是连续的,且不能含空洞)
RAMIMAGE:专用于保存镜像的内存区域。(每个.bin中只能指定一个RAMIMAGE)
RESERVED:保留内存区域(这样的区域一般用于驱动程序使用,如显卡缓冲区、DMA缓冲区)
举例:
;名称 首地址 大小 内存类型
IF IMGRAM64
NK 80220000 009E0000 RAMIMAGE
RAM 80C00000 03000000 RAM
UMABUF 83C00000 00400000 RESERVED
ENDIF

注:整个内核的地址都是从0×8000 0000开始的。如果是x86系列的CPU,那么物理内存地址与虚拟地址映射关系在oeminit.asm中指定。

【CONFIG】类似环境变量,PB预设置了一些配置变量。常用的配置及说明如下:
AUTOSIZE:
格式:AUTOSIZE = OFF | ON

  默认值为OFF。在config.bib中的MEMORY部分定义了有效的内存区域,其中两部分RAM、RAMIMAGE分别用于进程使用区域和保存镜像区域。如果为ON,romimage.exe在创建nk.bin时将RAM和RAMIMAGE两部分合并成一个部分,然后从最低地址开始保留RAMIMAGE大小的内存,其余都作为RAM使用。

BOOTJUMP:
格式:BOOTJUMP = address | NONE

  默认值为NONE。每次重新启动CE内核,默认执行的代码从RAMIMAGE的首地址开始。如果在BOOTJUMP指定一个地址(必须在RAMIMAGE范围内),那么将从指定的地址开始执行。

COMPRESSION:
格式:COMPRESSION = OFF | ON 

  默认值为ON。romimage.exe在创建内核时默认压缩所有可写部分。对于文件,默认全部压缩。对于模块(.exe、.dll),默认压缩可写部分。模块的可写部分包括数据段,也就是在模块运行时一定加载到内存中的部分。如果模块在.bib中定义时具有C属性(表明压缩模块所有部分),那么当前这个选项就忽略了。

FSRAMPERCENT:
格式:FSRAMPERCENT = number 

  默认值为0×80808080。指定为文件系统分配的内存的百分比。number分为四个字节,由十六进制表示。

byte0的值(单位为4KB)表示在第一个2MB中,其中每1MB包含的4KB的整数倍。
byte1的值(单位为4KB)表示在第二个2MB中,其中每1MB包含的4KB的整数倍。
byte2的值(单位为4KB)表示在第三个2MB中,其中每1MB包含的4KB的整数倍。
byte3的值(单位为4KB)表示在剩下的内存中,每1MB包含的4KB的整数倍。

  计算一下默认值0×80808080表示的百分比:0×80*4K/1M = 0.5,因为每个字节都等于0.5,所以整个占用的百分比是50%。

KERNELFIXUPS:
格式:KERNELFIXUPS = OFF | ON

  默认值为ON。如果为ON,romimage.exe创建内核前重定位内核到RAM的开始位置。

OUTPUT:
格式:OUTPUT = path

  指定romimaeg.exe将创建完成的内核文件nk.bin放置到的路径。一般放置到%_FLATRELEASEDIR%下。

ROMFLAGS
格式:ROMFLAGS = Flags

设置内核选项的位掩码,多个位掩码可以组合使用。

  • 0×0001 禁止按需分页:EXE和DLL默认是按需分页的。
  • 0×0002 禁止全内核模式:进程运行在两种模式下,用户模式和内核模式。全内核模式下所有线程运行在内核模式。全内核模式能够提高执行效率,但会增加系统的不稳定性。如果允许执行用户程序,那么不适合采用全内核模式。
  • 0×00000010 只信任来自ROM的模块(DLL、EXE)。默认ROM中的模块和所有文件系统的模块都是内核信任的。OEM能够在OAL层实现对所有运行模块的检查,这个标志将忽略对来自ROM保存的模块的检查。
  • 0×00000020 停止刷新TLB。这个标志仅用于运行在x86CPU上的内核。TLB(Translation Look-aside Buffer),有人翻译成变换索引缓冲区,它的作用是在虚拟地址和物理地址之间转换。对于具有实时性的内核,这个标志应该设置。
  • 0×00000040 按照/base链接选项中的地址加载DLL。这样内核将不采用重定位加载DLL。不建议采用。
ROMSIZE
格式:ROMSIZE = size

指定内核镜像的大小

ROMSTART
格式:ROMSTART = address

指定内核镜像的首地址

ROMWIDTH
格式:ROMWIDTH = width

指定数据宽度,一般为32位

ROMOFFSET
格式:ROMOFFSET = address

指定偏移地址。

SRE
格式:SRE = OFF | ON

指定romimage.exe是否产生.src文件,一般烧录ROM的程序能够识别此文件。

注:config中绝大多数【CONFIG】选项不需要修改。凡是配置文件都可以使用IF/ENDIF 条件语句。

【MODULES】定义镜像要包含的模块并指定模块(DLL、EXE)如何被加载到内存表中。
格式:模块名称 路径 内存块 类型 

  模块名称一般为模块的真实名称;路径为当前文件所处的位置(路径中指定的文件名和前面模块名称最好一致);内存块是指这个模块将被存放到哪个内存块中,内存块的定义见前面MEMORY部分;类型指定这个模块将被存放的属性,具体类型如下:

  • S:系统文件
  • H:隐藏文件
  • R:只压缩模块的资源部分(默认模块是不压缩的)
  • C:压缩模块所有部分
  • D:禁止调试
  • N:标志模块是非信任的
  • P:忽略CPU类型
  • K:指定romimage.exe修正模块(仅用于调试或者内核跟踪)
  • X:指定romimage.exe对此模块验证签名
  • M:运行时加载整个模块,而不是按需分页
  • L:不分离DLL在进程地址空间和Slot 1
举例:
MODULES
init.exe %_WINCEROOT%\RELEASE\INIT.EXE NK SH
nk.exe $(_FLATRELEASEDIR)\kitlnokd.exe NK SHD
nk.exe $(_FLATRELEASEDIR)\kitlnokd.exe NK SHN
【FILES】定义镜像要包含的文件并指定文件如何被加载到内存表中。
格式:模块名称 路径 内存块 类型

具体类型如下:

  • S:系统文件
  • H:隐藏文件
  • U:不压缩文件(默认是压缩的)
举例:
FILES
initobj.dat %_WINCEROOT%\RELEASE\INITOBJ.DAT NK SH
【.dat File System File】定义目录和指定文件位置。当冷启动CE平台时,filesys.exe用这些数据
创建目录、快捷方式、文件(在RAM文件系统)。
举例:
;;创建根目录下子目录Program Files
root:-Directory("Program Files")
;;创建目录Program Files下一个子目录My Projects
Directory("\Program Files"):-Directory("My Projects")
;;复制文件从\Windows\Myproj.exe到\Program Files\My Projects\My Project.exe
Directory("\Program Files\My Projects"):-File("My Project.exe", "\Windows\Myproj.exe")
;;复制文件从\Windows\control.lnk到\control.lnk
root:-File("\control.lnk", "\Windows\control.lnk")

快捷方式的运用:如果要在CE平台的桌面上显示一个程序的快捷方式,实现步骤为:

  1. 创建一个快捷方式。在开发机上用记事本一类的文字编辑软件写入字符格式为:长度#路径。其中长度为路径的字符个数。
    例如"16#\windows\abc.lnk",注意路径中空格也算在内。完成后保存为ASCII码的扩展名为.lnk的文件。
    将此快捷方式文件*.lnk复制到%_FLATRELEASEDIR%下,也就是PB编译的所有文件存放的目录。
  2. 在project.bib中的FILES部分下按FILES的格式键入字符。例如:
    FILES
    abc.lnk $(_FLATRELEASEDIR)\abc.lnk NK S
  3. 在project.dat中指定abc.lnk文件所存放的位置。例如:
    root:-Directory("\Windows")
    Directory("\Windows"):-Directory("LOC_DESKTOP_DIR")
    Directory("\Windows\LOC_DESKTOP_DIR"):-File("abc.lnk","\Windows\abc.lnk")
【.reg Registry file】设置注册表项。关于注册表见我的文章《开发实例二:保存信息》。
数据类型           格式
REG_SZ             "my string"
REG_DWORD           DWORD: NNNNN (十六进制)
REG_MULTI_SZ        multi_sz: "my string"
REG_BINARY hex:     xx,xx,xx,xx ...
HEX hex(xxxxxxxx):  xx,xx,xx,xx

例如:
[HKEY_LOCAL_MACHINE\init]
"Launch60"="myproc.exe" ///REG_SZ类型
"Depend60"=hex:14,00, 1e,00 ///REG_BINARY类型
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\TRUEFFS_UNAND\FATFS]
"MountFlags"=dword:2 ///REG_DWORD类型
【.db The database files】数据库文件保存在对象存储中。实际应用的不多,在这里不再过多讲解。
【.str string files】类似EVC中的字符串资源。

  用于指定ID与字符串的关联。CE支持很多国家语言,所以内核使用的字符串可能采用不同国家的语言。为此,CE将字符串用ID来定义,在.str文件中指定ID对应的字符串。包含.str文件的目录名采用国家码来设置,例如"C:\……\0410\cepc.str"。

作者: 分类: 分类:其他 标签: 关键词:

Platform Builder之旅(二)

2008年3月2日 没有留言

Platform Builder之旅(二)

作者:付林林

  上一章所说,当用PB的"定制平台向导"选取了一个平台的所有特征(feature)后,接下来的工作就是编译了。即使你从来未曾编译过,你也能想象得到编译的时间一定很长。因为PB是在编译一个操作系统,而非一个应用程序。当然,越快的硬件环境编译的速度就越快。一般我编译一个内核需要5分钟到10分钟之间。
  在编译之前你可能还要对这个CE平台的某些特征进行修改。为此,你必须熟悉PB的操作环境。下面图1是PB打开一个平台工程文件的界面。


图一 PB主界面

图一中数字所指示的内容描述如下:

  1. "Build"工具栏。此工具栏上按钮、下拉框都用于编译、调试。数字1指向的下拉框是编译指令集,可以指定不同的指令集来编译CE平台或者应用程序。
  2. "Workspace"窗口。此窗口有三个子视图,分别为FeatureView、ParameterView、FileView。当打开一个平台工程文件后,FeatureView显示这个平台所有的特征。如设备驱动程序、各个软件组件等。ParameterView显示所有平台通用的配置文件和当前平台的配置文件,这些配置文件扩展名为*.bib、*.reg、*.db、*.dat。FileView显示在当前CE平台上建立的应用程序源码文件、资源文件、资源脚本文件等。也就是说如果在当前CE平台上建立一个应用程序工程,那么所有的文件都在FileView中显示出来。类似EVC、VC的"Workspace"窗口中的"FileView"。注:关于FeatureView和ParameterView包含的内容在以后的文章中讲解。
  3. "Output"窗口。用于显示输出信息。类似EVC、VC的"Output"。
  4. "Target"窗口。此工具栏上按钮分别用于下载内核文件到模拟器或实际平台、连接、断开。当一个CE平台编译好了之后,就可以按下载按钮将平台(nk,bin)文件下载到模拟器上运行。
  5. "Catalog"窗口。这个窗口包含所有的CE支持的特征。
  6. 状态栏图标。位于状态栏最右端的四个图标中,最左边的图标表示当前下载状态。另外三个表示三种服务状态,这三种服务运行在目标机(target device)上。在这里就是模拟器。

  要向当前CE平台添加特征,首先在右边"Catalog"窗口中找到要添加的特征,找到后移动鼠标光标到此特征上,然后单击右键,在弹出的菜单中单击"Add to Platform",PB就将此特征添加到左边当前CE平台中。如果无反应说明此特征已经被添加进去了。要删除当前CE平台中某一个特征,移动鼠标光标到此特征上,单击右键,在弹出的菜单中选择"Delete"。并非所有的特征都可以任意删除,因为有些特征是彼此关联的。这部分将在以后的文章中讲述。
  对平台进行一些基本的设置,打开菜单"platform"-"Settings",检查"Locale"选项卡中地区和语言设置。这一点很重要,它决定着编译的平台采用的语言种类。再在"Environment"选项卡中添加"IMGRAM64"环境变量,值设置为1。单击"OK",PB开始将此环境变量加入到平台中。单击工具栏上"Build Platform"按钮开始编译。
  在讲述编译过程前必须先了解环境变量以及如何读取和设置环境变量。一个环境变量包含了一个CE操作系统某一方面的信息。例如一个驱动程序、一个路径、一个配置文件、一个特征等。当PB编译CE平台时,先做的工作就是收集所有的环境变量供编译器使用。读取和设置环境变量的最好方法是单击PB菜单"Build"-"Open Build Release Directory",PB会弹出一个控制台窗口,也就是命令行外壳。键入"set"命令,当前平台所有的环境变量就显示出来了,不过要多屏显示。为了看清楚每个变量的值,可以键入"set |more",这样就可以分屏查看了。还可以将所有环境变量信息保存到硬盘上,比如键入"set >C:\envi.txt"。要查看单个环境变量值,键入"set 环境变量名"。要修改原环境变量的值键入"set 环境变量名=值"。有些环境变量无需键入值就可以达到修改目的。比如前缀为"BSP_"和"SYSGEN_"的变量,键入"set 环境变量名="就取消了这个环境变量。在IDE中也可以修改环境变量,如上面所说的设置"IMGRAM64"的值,就是在IDE中修改的。利用环境变量也可以添加和删除特征,如BSP变量。BSP变量分两种,一种以BSP_NO为为前缀,一种以BSP为前缀。以BSP_NO为前缀表示当前平台不支持某一特征,以BSP为前缀表示支持这一特征。例如BSP_SERIAL2表示此CE平台支持串口2;BSP_NOSERIAL表示此CE平台不支持串口。如果在PB的"catalog"中找不到要添加的特征,可以通过设置BSP变量来实现。具体BSP环境变量参见CE帮助文档。

下面讲述整个编译过程中PB所做的工作:

  • 执行cebuild.bat批处理文件。
  • cebuild.bat调用sysgen.bat批处理文件。
  • sysgen.bat调用cesysgen.bat批处理文件,cesysgen.bat负责在*.wce文件中搜索用户选择的特征,然后形成一系列环境变量。之后PB会显示这些变量,下面几个步骤就是显示收集的变量。
  • 产生SYSGEN变量。每个SYSGEN变量对应一个特征。
  • 产生CE_MODULE、COREDLL_COMPONENTS、FILESYS_COMPONENTS、DEVICE_COMPONENTS、GWE*_COMPONENTS、DCOM_MODULES、FONTS_COMPONENTS等环境变量。其中每个环境变量包含某一个特征具体的内容。从环境变量名称就可以看出来是哪种特征。
  • 对_DEPTREES环境变量指定的每个目录分别执行sysgen.bat批处理。_DEPTREES这个变量的值是一些目录名(例如DCOM、IE、SERVERS、DIRECTX、WCESHELLFE等),这些目录名位于%WINCEROOT%\public。如果安装PB v4.1时默认安装路径,那么此目录路径为C:\WINCE410\Public。
  • 编译BSP。因为我们采用的BSP是Emulator,所以PB会编译%WINCEROOT%\Platform\Emulator目录下三个子目录KERNEL、DRIVERS、GWE中的源码文件。
  • 清除_FLATRELEASEDIR环境变量指定的目录下的所有文件、子目录。假如我们定制的平台路径为C:\Emulator,那么这个环境变量的值为C:\Emulator\RelDir\Emulator_X86Release。
  • 复制%_PROJECTROOT%\所有文件到_FLATRELEASEDIR。
  • 根据本地地区环境变量,寻找所有与本地语言相关的*.str文件复制到_FLATRELEASEDIR中。*.str文件中包含了字符串资源,将字符串与ID关联。在_FLATRELEASEDIR目录下你可以看到以地区码为目录名的子目录。
  • 处理NLS(国家语言支持)数据。
  • 执行fmerge.exe。合并所有*.bib文件为一个文件ce.bib,合并所有*.reg文件为一个文件reginit.ini。
  • 执行cebuild.bat批处理文件。
  • 执行fmerge.exe。合并所有*.db文件为一个文件initdb.int,合并所有*.dat文件为一个文件initobj.dat。
  • 运行regcomp.exe压缩reginit.ini。
  • 运行txt2ucde.exe。将整个CE平台涉及到的所有字符串转成unicode码。
  • 运行res2exe.exe。将所有*.dll、*.exe、*.cpl文件中的资源更新。资源更新部分主要和语言相关。
  • 运行Romimage.exe。将所有文件合并压缩成一个文件nk.bin(默认文件名)。

  整个编译过程被调用的批处理文件和EXE文件主要包括:cebuild.bat、sysgen.bat、cesysgen.bat、nmake.exe、txt2ucde.exe、makeimg.exe、fmerge.exe、regcomp.exe、res2exe.exe、romimage.exe、build.exe。在这里声明一点,我不保证所讲述的PB的编译过程一定是准确无误的。从总体上讲PB所做的工作就是这样。

作者: 分类: 分类:其他 标签: 关键词:

Platform Builder之旅(一)

2008年3月2日 没有留言

Platform Builder之旅(一)

作者:付林林

  在以前的文章中我已经数次提到了Platform Builder(简称PB),并且简单的讲述了利用PB v4.1的定制平台向导(New Platform Wizard)创建了几个CE的平台。从这一篇文章起,我和PB爱好者们一起进入PB的世界,一起领略PB的风采,一起学习PB。写每一篇文章对我来说都是一个进步,希望大家能够多提宝贵意见,多阐述看法。
  相信看到我以前写的文章你已经会利用定制平台向导来定制简单的内核了。这次我仍然用这个向导,只不过采用自定义配置来选择平台的组件。自定义配置的优点是能够更细致的选择组件,这样定制的平台只包含我们需要的功能,而不要的全部抛弃。首先打开"New Platform",在"Step 2"中选择"EMULATOR: X86"。在这里强调一点:能够运行PB创建的CE平台的环境有三种。第一种是真实环境,包括某一种CPU和支持的主板还有其它配置;第二种是模拟环境,PB包含了模拟器,能够在PC上模拟运行CE平台;第三种是PC环境,PB可以创建能够在PC机运行的CE平台。并且提供了一组引导文件,通过这些引导文件可以加载CE内核文件(nk.bin)并启动Windows CE。三种环境相比较,如果具备真实的环境那是最好了,模拟环境只能模拟简单的功能,PC环境和模拟环境相似,只适合用来学习PB。PC环境需要的引导文件可以通过如下办法得到:在PB的安装所在位置(比如C盘)查找文件Websetup.exe,运行这个文件,这个程序会解压出一个名为WEBIMGNT.EXE的文件。再查找名为cepcboot.144的文件,将cepcboot.144文件复制到同WEBIMGNT.EXE同一个目录下。插入软盘到A驱,然后在控制台程序(cmd.exe)下输入命令"WEBIMGNT.EXE cepcboot.144"。在弹出的对话框中单击"A drive",程序把解压出来的启动文件都复制到软盘上。编辑启动文件中的"Autoexec.bat"批处理文件,如果PC配置的网卡是被支持的(微软推荐的网卡类型有NE2000、SMC9000兼容网卡、RealTek RTL8139等),并且是PCI接口的,按如下修改:

set NET_IRQ=9
set NET_IOBASE=0
  修改之后还要输入一个静态的IP地址。这个IP地址要和运行PB的电脑的IP地址处于一个子网内。实际上PC环境还是无法实现CE平台的大多数功能,所以对于要学习PB而又不具备真实环境的人来说,模拟器是比较合适的。
  回到定制平台向导,在"Setp 3"中单选"Custom configuration",输入平台名称和路径。在"Step 4"中必须单选"Custom Device with Shell and Graphical User Interfac"。表示平台将加入外壳程序和GUI。有了资源管理器这样的外壳程序我们操作就方便多了。在"Step 5"中列出的是"Application & Services Development"。这些都是用于软件开发的库。大多数支持库我们在PC上开发时早已熟悉了,有几个是CE独有的。比如"Simple Network Management Protocol"(简单网络管理协议),这是用在网络设备上的协议;"Pocket Outlook Object Model API",用于读取Pocket PC中"Inbox"软件中的数据;"Beta .NET Compact Framework"是.NET的支持框架。这个在PB v4.1中不要选取,它在PB v4.2中才是正式版。其余的选项说明参见CE帮助文档(位置:operating system development\windows ce.net overview\catalog features\applications and services development)。"Step 6"中列出了Windows CE自带的应用程序。"Step 7"中列出了操作系统内核支持的服务。包括串口支持、并口支持、USB口支持、调试工具、电源管理,还有一些其它特征。这里的调试工具不仅仅指能够用于调试的应用程序,还包括用于调试的API函数。Toolhelp就是专门用于查看当前操作系统的进程及进程包含的线程、DLL的信息。"Kernel Features"(内核特征)中的Fiber API是用于支持纤程的API。"Keyboard & Touch Driver Debugging Sample Applications"包括四个调试工具,用于调试触摸屏和键盘的驱动程序。"LMemDebug memory debugging hooks"用于查看当前操作系统正运行的程序的内存信息。在"Step 8"中列出的是网络特征(我有时称特征为组件,实质一样)。包含CE支持的所有网络协议。"Networking Features"中大多数的子项都要加入的,其它项按需加入。比如要支持红外线一定要加入PAN中的IrDA。要拨号上网的一定要加入WAN所有项。"Step 9"中列出了存储特征。包含和存储设备相关的支持。具体包括存储管理器(支持CDFS、FAT文件系统)、数据库支持、ROM和RAM文件系统、注册表存储支持。关于ROM和RAM、FAT我在以前的文章中提到过,这里就不再详细讲解了。"Step 10"中列出了CE包含的所有英文字体。要了解这些字体中每种字体所占空间大小,可以将鼠标放到字体名字的上面,系统就会显示这种字体的大小。一般来说一个定制的CE平台其中字体尤其是中文字体占用空间是很大的,所以选择字体要慎重。除非必要,否则不要添加太多的字体。"Step 11"列出了国际化选项。包括各种语言支持包。在这里选择"National Language Support[NLS]",再选择一种本地区语言,比如"Chinese {Simplified}"。"Agfa AC3 Font Compression"建议选择,这是一种字体压缩技术,适合中文字体。在"Chinese {Simplified}"第一子项中列出了字体。这一项选择至关重要,因为中文字体占用的空间太大了,直接影响CE平台的总体大小。具体选择哪些字体请参见CE帮助文档(位置:operating system development\windows ce.net overview\catalog features\ International)。从帮助文档中才能了解具体哪个子集包含哪些中文字体和字符集。"Chinese {Simplified}"其它子项包括中文输入法、输入法编辑器建议全部选择。"Step 12"列出了CE包含的Internet客户端程序、支持的组件和脚本。第一项"Browser Application"中建议选择第一子项"Internet Explorer 5.5 for Windows CE Components",而第二子项"Pocket Internet Exlporer"是用在PDA上的功能较少的Internet浏览器。第二项"Internet Explorer 5.5 for Windows CE Components"中建议选择全部子项。这些子项都是开发IE的API函数、Active X控件。第四项"Sample IE 5.5 Internet Options Control Panel"是"控制面板"中的用于修改IE选项的程序。和Windows 桌面操作系统下"控制面板"中的"Internet 选项"一样。"Step 13"列出了CE支持的多媒体服务。可以任意选取要播放的各种媒体和具体媒体的格式。Direct X也可以分拆选取。"Step 14"列出了CE支持的安全服务。"Step 15"列出了各种外壳和用户接口。外壳程序一般常常选择"Graphical Shell"中的标准外壳程序"Standard Shell",也就是资源管理器。"Step 17"是最后一步。单击"Done"按钮,PB将用户选择的所有选项保存到脚本文件(*.wce)中。当编译CE平台时,sysgen.bat批处理文件会调用cesysgen.bat批处理文件,cesysgen.bat读取*.wce文件的内容,根据此文件的内容来设置全部的环境变量。cesysgen.bat处理之后sysgen.bat调用nmake.exe 程序根据环境变量来编译模块(针对源码文件,如C语言文件)、复制模块(针对非源码文件,如DLL等)。具体编译操作以及编译时PB所做的工作我将在下一篇文章中详细讲述。

作者: 分类: 分类:教程精华 标签: 关键词:

如何控制CE系统的重启或者关机

2008年3月2日 没有留言

可以调用函数ExitWindowsEx, 在Win
CE上,这属于Undocument API,虽然没有公开,但是可以使用。
/*
#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 1
#define EWX_REBOOT 2 重启
#define EWX_FORCE 4
#define EWX_POWEROFF 8 关机
*/
extern "C" BOOL ExitWindowsEx(UINT uFlags, DWORD dwReason);
ExitWindowsEx(EWX_REBOOT, 0); //重启
ExitWindowsEx(EWX_POWEROFF, 0); //关机

2.动态链接库注入机制
在Windows 2000中提供了很多DLL注入机制:
使用注册表来插入DLL
使用Windows挂钩来插入DLL
使用远程线程来插入DLL
使用特洛伊DLL来插入DLL
将DLL作为调试程序来插入
但是,作为嵌入式操作系统,提供的接口少多了,在Smartphone 2002 (基于Windows CE 3.0) 中并不提供动态链接库注入机制,在Smartphone 2003才提供,使用Dll Inject机制,可以在注册表中设置关键字HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL的值,该关键字数据类型为REG_MULTI_SZ,包含一个DLL文件名或者一组DLL文件名(用逗号分离),列出的每个DLL文件名都可以包含一个路径。当系统启动时,列在该键值中的每个DLL会映射到系统加载的每个进程中(Nk.exe和Filesys.exe除外)。
当进程创建时,系统将分配进程的地址空间,接着将可执行文件映像和所有需要的DLL文件(包括HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL注册的所有DLL)映像映射到进程的地址空间中。然后才创建进程的主线程,并使用该线程调用每个DLL的带有DLL_PROCESS_ATTACH值的DllMain函数。当已经映射的所有DLL都对通知信息作出响应后,系统将使进程的主线程开始执行可执行模块的C/C++ Runtime启动代码,然后执行可执行模块的进入点函数(WinMain)。
如果DLL(不包括HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL注册的任何DLL)的任何一个DllMain函数返回FALSE,表明初始化没有取得成功,系统便终止整个进程的运行,从它的地址空间中删除所有文件映像,给使用户显示一个消息框,说明进程无法启动运行。
前面说过,NK.exe和Filesys.exe不受该键值的影响,这主要是由于Windows CE的启动过程造成的[4]。
当系统复位时,CPU将跳转到NK.exe的入口。NK.exe是Windows CE的核心模块,入口的代码实际上是由OEM编写的,而不是Microsoft,因为不同的平台,硬件也不一定相同,因此Windows CE需要OEM编写一些特定的初始化代码,这些代码被并入内核的硬件抽象层(HAL, Hardware Abstraction Layer),当OEM为特定硬件平台建立系统时,HAL将和Windows CE内核代码静态连接而产生NK.exe。
Nk.exe在设计时与文件系统(包括注册表系统、数据库系统)是独立的,也就是说NK.exe不会负责文件系统的初始化,但是在NK.exe初始化过程中要用到注册表数据,因此,当NK.exe启动后,将创建有名事件(Named Events)SYSTEM/FSReady,加载并运行系统程序Filesys.exe, 然后转入睡眠等待事件变为已通知状态。
Filesys.exe负责管理文件系统、数据库函数和注册表。Filesys.exe被加载后,将检测这次启动是冷启动还是热启动。冷启动和热启动的最大区别就是内存中是否存在已初始化的文件系统。
如果是热启动,内存中保留了上次使用的数据,Filesys.exe将使用这个已初始化的文件系统。如果是冷启动,Filesys创建一个文件系统,将空内存文件系统和ROM中的文件合并在一起。
当文件系统存在后,Filesys.exe会创建默认的数据库和注册表,初始化本地语言支持模块(National Language Support, NLS)。
接着Filesys.exe将事件SYSTEM/FSReady置为已通知状态,然后转为睡眠状态等待Nk.exe完成初始化后将其唤醒。
由于事件SYSTEM/FSReady置为已通知状态,NK.exe被唤醒接着运行,此时,注册表已被Filesys.exe创建,NK.exe根据注册表的键值继续运行,如配置虚拟内存管理器,初始化默认处理程序的中断向量表,初始化端口等等,当然,最重要的是通知Filesys.exe可以继续运行。
Filesys.exe被唤醒后,接着进行后续的初始化工作,如根据列在注册表HKEY_LOCAL_MACHINE\System\Events中的名字创建有名事件SYSTEM/PowerManagerReady,SYSTEM/GweApiSetReady,SYSTEM/ShellAPIReady,SYSTEM/BatteryAPIsReady等等,这些有名事件的初始状态都是未通知状态,后面有相应的程序来对其进行设置,如图形窗口和事件管理器(GWE,Graphics Windowing and Event Manager)初始化图形API后,会把有名事件SYSTEM/GweApiSetReady值为通知状态,系统知道图形API有效,可以进行图形绘制。
所以,在Nk.exe和Filesys.exe被加载前,系统不可能去搜索注册表,更谈不上Dll Inject钩子机制。
关于Windows CE的详细的启动步骤请参考MSDN。

作者: 分类: 分类:其他 标签: 关键词:

wm6.1 19199 Kitchen Rom制作记录

2008年2月28日 没有留言

1.蓝牙问题:蓝牙不能切换修改注册表
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Bluetooth\HCI]
"baud"=dword:e1000
"flags"=dword:1
"name"="COM2:"
"Priority256"=dword:6e
"ReadIntervalTimeout"=dword:1
"ReadTotalTimeoutConstant"=dword:3e8
"ReadTotalTimeoutMultiplier"=dword:0
"WriteTotalTimeoutConstant"=dword:3e8
"WriteTotalTimeoutMultiplier"=dword:0
正确值:"baud"=dword:e1000

2.默认同步
hkey_local_machine\drivers\USB\functiondrivers\defaultclientdriver
正确值:RNDIS

3.闹钟不想
添加[HKEY_CURRENT_USER\ControlPanel\Sounds\Clock]
"Category"="Alarm"
[HKEY_CURRENT_USER\ControlPanel\SoundCategories\Alarm]
"Speaker"=dword:1
到oem里的rgu

作者: 分类: 分类:SYS定制教学 标签: 关键词:

微软手机操作系统 定制ROM入门 转贴

2008年2月28日 3 条留言

微软手机操作系统 定制ROM入门 转贴 http://ioicn.com.cn

想要修改ROM真的比较麻烦,光软件就要装好几个。。。。
1、BIN转换NBF格式
  [ActivePerl-5.8.7.813.zip]、[NbfUtils.rar]、[typhoonnbfdecode.pl.rar]
2、提取ROM中的文件
  [dumpromxSDA.zip]
3、修改CE注册表default.fdf
      [romtools.rar]
软件就不全提供了,因为还要抄教程,直接给链接吧
[NbfUtils.rar]、[typhoonnbfdecode.pl.rar]在BINGO123的“【教学】关于如何将BIN等转换成NBF文件”附件
http://www.ioicn.com.cn/bbs/view … ghlight=%2Bbingo123
需要安装,请按BINGO123的教程操作。
[ActivePerl-5.8.7.813.zip]、[dumpromxSDA.zip]在"【讨论】修改键盘(使565可以用575、585的ROM)"附件
http://www.ioicn.com.cn/bbs/view … ight=%2Bstormorwind
[romtools.rar]在本帖附件。

关于刷机的风险,大家都已经知道了,看过一个星期帖的都应该已经看到有很多朋友壮烈了。。。
目前最保险的方法,就是用USB联电脑刷机,并且是只刷OS部分,而不是全刷,特别是SPL部分,一不小心就死了!切记!也请刷机在三遍以下的朋友不要搞这个,嘿嘿。。。。
俺也碰到一次刷机后只看到开机画面,十分钟后画面淡去!不过俺只刷了OS部分,SPL仍然为1010064,所以找到原来好的OS,刷回来就好了。无险。。。。

装好软件,把[dumpromxSDA.zip]、 [romtools.rar]的文件解压到一个目录中《turnROM》,主要工作就是在这个目录中操作,主要使用的工具就是:dumpromx.exe、typhoonnbfdecode.pl、fdf2reg.pl、reg2fdf.pl四个,其他的可以不要。。。

开始吧。。。
1、在turnROM目录新建一个文本文件,打开输入cmd,保存退出。改名为dos.bat(需要闭关资源管理器“隐藏已知类型文件的扩展名”选项),这是进入DOS命令窗口的快捷(命令批处理)。双击运行dos.bat,进入DOS命令窗口,应该当前目录就是turnROM。。。

2、测试ROM文件为BIN格式,文件名为:ROM.BIN
  命令:perl typhoonnbfdecode.pl -x rom.bin
  会得到五个nb文件
  命令:ren 04e3d4c0-OS.nb OS.nb
  会得到OS.NB

直接使用NBF格式的ROM,要使用TyphoonNBFTools(就是降级SPL1010064的工具),打开ROM.NBF,在下半个窗口的OS上点右键,选择dump decrypted,在打开的窗口中输入文件名OS,保存,过一会儿,得到OS.N_D
OS.NB与OS.N_D两个文件完全一样,都是OS的镜象文件,以下文件名以OS.NB为例。。。。

3、提取ROM文件
3.1 提取ROM的全部文件
  命令:md ROM
  命令:dumpromx os.nb -d rom
  建立一个ROM目录,将ROM(OS.NB)的文件全部放入ROM目录中
3.2 提取ROM的单个文件,文件例(注册表文件):default.fdf
  命令:md temp
  命令:dumpromx os.nb -d temp -f default.fdf
  建立TEMP目录,提取的default.fdf放在TEMP目录中。。。
  需要指出的是,ROM的文件排列格式比较复杂,还没有完全搞清楚。用全部提取文件的话,得到的都是完全组合好的文件,也就是手机RAM中的文件,但要想写回ROM中的话,有好多文件(特别是.exe/.dll文件)需要单个提取。。。
  命令:dumpromx os.nb -d temp -f keybddr.dll
  得到键盘驱动库keybddr.dll,分为四个文件(keybddr.dll.0/keybddr.dll.1/keybddr.dll.2/keybddr.dll.eo),keybddr.dll是完整文件,对写回ROM无用。。。

4、将文件写回ROM,例ROM文件:OS2.NB(为了不同型号ROM替换文件)
4.1 多个文件写入ROM
  命令:md in
  建立一个IN目录,将需要写回的所有文件复制进IN目录(只能是小文件,目前还不能确定有哪些,不过提取出来后只有单个部分的文件,应该没问题)
  命令:dumpromx os2.nb -a in
  得到in.nb
4.2 单个文件写入ROM
  把需要写入ROM的文件放到turnrom目录,如(keybddr.dll.0/keybddr.dll.1/keybddr.dll.2/keybddr.dll.eo)
  命令:dumpromx os2.nb -f keybddr.dll -f keybddr.dll
  得到keybddr.dll.nb
  (每个文件写入,命令行都会返回如:
    ERROR: could not find pointer for ofs 80085864
    ERROR: could not find pointer for ofs 00000000
   之类的信息,不用理会,这只是ROM文件与dumpromx程序不太配套造成的(dumpromx不是官方程序),并不是出错,成生的NB文件没有问题的。。。

   有许多.exe/.dll文件好象格式比较复杂,无法写回,命令行会返回如:
   Warning! ROM OV7648.dll.1 realaddr = 01f6c000 but ov7648.dll.1 realaddr = 01f6b000
   Warning! ROM OV7648.dll.2 realaddr = 03b05000 but ov7648.dll.2 realaddr = 03b08000
   之类的警告信息
   或者干脆出来一大堆信息,那就是说写入失败,虽然最后也得到了NB文件,绝对不能使用的。。。)

  新的ROM镜象生成,统一命名为:NEW.NB。。。。

5、转换为NBF文件写入手机
  命令:perl typhoonnbfdecode.pl -r os=new.nb -c new.nbf
  得到NEW.NBF
      然后用把NEW.NBF复制到IU_SPL+PatchedRUU目录,用手机USB联机电脑的方法将NEW.NBF刷进手机,搞定
看看结果吧。。。。

6、修改CE注册表default.fdf
  第3步已经提取了CE注册表文件default.fdf,现在利用
  命令:perl fdf2reg.pl default.fdf default.reg
  得到default.reg,这就是手机的注册表,好多默认的东东都在这里面,相信不用多讲,需要的就是耐心,慢慢把你需要修改的选项找出来。。。
  这里当然要小心了,改错了的话手机功能不齐都是有可能的。。。。

  命令:perl reg2fdf.pl default.reg default.fdf
  得到default.fdf,改好后的注册表文件转换为CE注册表格式,可以写回ROM了。。。

目前学到的就是这些了,还有一个有用的东东,没有搞清楚呢。。。。
initflashfiles.dat文件是RAM复制到手机\storage目录的文件列表库,用WORD以unicode格式打开,就可以看到内容,把不想要的文件行删除,最后保存为.TXT文本。。。。
这个没有进行测试呢,要转换为.DAT格式的文件需要用到tounicode.c这个脚本(.pl文件都是脚本命令),应该是C语言吧,还没有找到呢。。。

关于RAM文件的删除,目前还没有找到方法,有人说把文件写为0字节,没什么用,文件是没了,可占用的空间还在,因为RAM是按内存位址写入的,如果要手工修改文件的位址的话,工作量太大了,而官方没有将工具提供出来,所以没办法。。。
个别文件的话只是有个想法,还没有写回测试,成功的话再具体写吧。。。
  命令:dumpromx os.nb -f
  得到ROM所有文件在ROM中位址信息,可能你无法在DOS窗口完全保存下来,但是是可以的。在DOS窗口的属性--布局--屏幕缓冲区大小,将宽度改为:255,高度改为:9999,保存属性-供以后相同窗体使用。然后输入cls,再输入以上命令,显示完成后点鼠标右键--全选,再点鼠标右键,DOS窗口的内容已经复制到剪帖板,新建一个文本文件,打开,粘贴,就可以把所有的信息保存下
来了。。。
  是供研究ROM内部文件结构使用的,大题来讲把一个分为文件名、文件结构表、文件内容,三部分,大的复杂的文件内容分为几部分,所以替换很困难,牵涉到位址的改变。不过这里提供了直接修改ROM文件的方法,需要研究一下ROM信息的位址信息,ROM分为五部分,就是开头的五行如img 01040000 : hdr=83156224 base=82040000  commandlineoffset=82040000这样,mg 01040000是内存实位址--在WINHEX中打开OS.nb就对应这个位址,base=82040000是定位转换位址--定位的基点, hdr=83156224 是信息位址--文件信息中显示就是这种位址。。。
  在WINHEX中定位文件的位址,需要用十六进制计算,以寻找文件前面的hdr位址减去定位基点位址,就得到文件在WINHEX中的offest,即hdr-base=img,找到所寻找文件的所有信息,全部清零,这个文件就不存在了。。。
  只用此试过摄像头驱动程序的替换,不过未成功,考虑到摄像头驱动程序的复杂性,曾经测试七八种方法都未成功,可能与此无关,下一步再测试是否可以完全删除一个文件,不过又牵涉到ROM中还有文件的列表统计,不知有没有影响,慢慢来吧。。。

作者: 分类: 分类:SYS定制教学 标签: 关键词:

(转贴) XIP移植教程

2008年2月27日 10 条留言

声明:这个贴不是本人所写,只是转贴,出处已经记不起是那了,请知道的说一下我补上,本贴仅供参考.其中有些内容其实有误,所以操作前请小心求证..
先说明一点,如果你的手机变砖头可别怪我,呵呵

一、准备工具:XIPPort.exe、mreloc.exe、Winhex.exe、Scoter Kitchen1.0等工具,工具的用法在这篇文章中会涉及到一些
二、ROM操作、提XIP
701的ROM是bin格式的文件,假设你的ROM文件名是ROM.BIN
从ROM中提取出XIP.bin:
把ROM.BIN复制到C:\Scoter Kitchen\Utilities\TOOLS\SRPX tools下面
执行以下命令:
msflshtool.exe rom.bin -d -p 1
SRPX2XIP.exe rom.bin.part1
把ROM.bin.part1.xip改名为xip.bin

一般最新内核都出现在HTC机型上,这里以NB格式的ROM来提取XIP
把NB文件命名为NK.NB并复制到C:\Scoter Kitchen\Utilities\TOOLS\SRPX tools
RomMaster.exe -x -w 5 nk.nb -o xip.bin

三、借想要的XIP
1.准备好想借XIP的xip.bin文件和你自己要升级的xip.bin文件,放在两个不同的目录,分别将XIPPort.exe放到他们在的目录,并运行dump xin.bin
2.分别执行write maps,可以在out目录得到MAP.physical.txt和MAP.txt,复制到别的地方备用
3.分别执行make pkgs,out目录被重新非配,将要借的XIP下的\OUT\MODULES\MSXIPKernel目录下的文件复制到自己的XIP的\OUT\MODULES\MSXIPKernel目录,替换相同的文件。(

此处注意,仅仅替换module形式的exe和dll,还有同名的txt文件,nk.exe, cecompr, ceddk, fsdspy等文件不要替换,如果有的话,OEMXIPKernel的目录更不能替换!!!!。)
4 、在自己的XIP的目录下操作:执行Undo操作
四、重新分配地址,在自己的XIP目录下操作
1.执行Relocate P'操作
2.执行write maps,得到新的MAP.physical.txt和MAP.txtR
首先查找旧的 ROMHDR offset,在你自己的旧的 MAP.txt 文件有类似的一行:
80768b30 – 80768b84 L00000054 rom_00 header: dlls=01fa01fe-02000000 phys=80600000-808ff47c, 23 modules, 10 files, 1 copyentries ext=8060283c ram=80900000-

84000000 cputype=000001c2,告诉你这个XIP中含有23 个modules, 10个 files, 1个copyentries ,你见到 – 80768b30- 它是你的旧offset – 在 nk.exe 的 S000 部份查找这hex 数值,在 hex 中这一个数值 30 8B 76 80, 修正它为你的新 romhdr offset,新的romhdr offset你可以在上面2中产生的 MAP.txt 文件中找到,如果相同就不用找了
五、生成新的xip.bin文件
1.打开新产生的的MAP.txt文件,如果没有哪一行出现“!!!!!!!!!!!!!!!!!”那么证明地址没有冲突基本成功了
2.执行build xip_out.bin,会在你的目录来新产生一个xip_out.bin的文件
六、问题解决
1.在第五的中1,发现在“!!!!!!!!!!!!!!!!!”
则要参考自己的旧的MAP.TXT文件,用mreloc.exe对相应的模块的地址按自己旧的MAP.TXT文件的地址进行修改
2、如果是在类似这样的地址80000000 – 80000000 L00000000 Start: first physical address的这一行到80276358 – 80276358 L00000000 End: highest physical address之间

的地址出现“!!!!!!!!!!!!!!!!!”
说明新装进来的文件在调入RAM时他们的地址和其他的东西有冲突了,你必须要调他们的地址,地址重复的地址长度在这一行的LXXXXXXXX中,,查看前后行的LXXXXXXXX值,看看他

们的地址长度是多少,再查找有NUL的行,它的LXXXXXXXX代表那里有相应的空的地址,如果空出的长度能装下出现“!!!!!!!!!!!!!!!!!”的上行或下行的地址长度+

“!!!!!!!!!!!!!!!!!”行的地址长度,你要做的是将那一行的数据移到空的地方!!
移动完一个数据段的数据,再做一下write maps,再重新查看MAP.TXT文件,如此重复,直到不再有“!!!!!!!!!!!!!!!!!”出现为止!
这样再做上面的第五步就可以了
3、数据段的移动方法:查看当前要移动的那一行的第一个数据,它是个地址值,如:80243fd8 – ,在OUT\MODULES对应的文件目录中imageinfo.txt中查找它,它可能是P+某个值

或是D+某个值,P或D的值可以在OUT里面的ROMHDR.txt中看到,修改imageinfo.txt的这个数据使其+P或+D的值等于你移动数据的目标NUL那一行的地址值,因为imageinfo.bin和

imageinfo.TXT的值是一一对应的,用WINHEX修改对应的数据,保存! 呵呵!这个是个细心量大的手工活,没有耐心的就不要做了
七、合成新ROM
把XIP.bin改名为ROM.bin.part1.xip并复制到C:\Scoter Kitchen\Utilities\TOOLS\SRPX tools下面
执行以下命令:
XIP2SRPX.exe ROM.bin.part1.xip
msflshtool.exe ROM.bin -p 1 -r ROM.bin.part1.xip.xiporg

仓促之际难免出错,此文重点是抛砖引玉,不足之处还请其他大侠来完成,原文出自DIYPDA,此文只是针对701做了一些修改。

作者: 分类: 分类:XIP移植教程 标签: 关键词:

自己研究ROM时收集的资料,可能对DIY的大侠们有用

2008年2月27日 1 条留言
作者: 分类: 分类:SYS定制教学 标签: 关键词: