现在的位置: 首页 > 综合 > 正文

按扇区读取Windows Mobile的数据

2013年06月16日 ⁄ 综合 ⁄ 共 1244字 ⁄ 字号 评论关闭

      在移动设备程序开发中,许多地方我们可以参考桌面电脑的开发方式,例如,MFC,不仅桌面电脑支持,而且基于Windows Mobile 5移动设备也支持。

      由于移动设备的体系架构与桌面电脑类似,都是由CPU,内存,非易失性存储器组成,因此,对于文件系统管理等方面,将PC上的文件系统引入到移动设备是个非常不错的选择。比如,Windows Mobile 5,(基于windows ce 5.0的内核),就采用了TFAT32的文件格式,相对于FAT32文件系统,TFAT32增强了安全性。

      微软的API中提供了CreateFile函数,这个对于从事编程的人员来说应该是非常熟悉不过的了,CreateFile函数不仅能够操作文件,还能操作各种IO设备,比如磁盘,COM口等。由于Windows Mobile 5将整个非易失性存储器(往往是FLASH,下面就将非易失性存储器粗略地当成FLASH,并以此称呼)划分成若干个逻辑分区,往往是3个,操作系统区,数据备份区,用户区。因此就可以使用CreateFile函数对这些逻辑磁盘操作了。

      首先,可以用FindFirstStore和FindnextStore函数查找存储设备,这些函数需要用到storemgr.h和storeapi.lib文件,这两个文件在Windows Mobile 5的SDK中都有,用上述函数能够得到存数设备的设备名,例如DSK:1等,这些将作为CreateFile的参数。我的设备插上SD卡后得到的设备名有四个,分别是DSK1:到DSK4:,其中DSK1是系统所在分区,文件格式未知,DSK2为备份区,就是恢复出厂设置的时候所用到的区域,DSK3是用户数据区,我们平常存放的短信啊,音乐文件啊都存放在这,也是用户唯一能使用的地方,DSK4就是SD卡。

     用CreateFile打开设备后,不能用ReadFile去读取数据,具体原因不清楚,可能是文件系统驱动未提供支持吧。如何读取数据?用DeviceIoControl函数,设置读的标志位DISK_IOCTL_READ,同时需要使用SG_REQ作为该函数的第三个参数,SG_REQ是一个结构体,里面指明了需要读取的磁盘的起始sector和读取sector的数量,该结构体包含在Diskio.h中,不过Diskio.h文件windows mobile 5.0的SDK没有,我是从PB5.0中的目录下拷贝过去的。

     由于调用FindFirstStore函数和FindNextStore函数能够获取磁盘的扇区数,所以只要根据获得的扇区数,就能完全读取Windows Mobile各个磁盘的数据。之后将其写入到U盘等设备中,那么打开U盘就像打开Windows Mobile设备一样了。不过其中发现了一个问题,读取用户区的数据之后,必须将头部的512*2的字节数据去掉,然后写入U盘才能打开U盘,不然会提示U盘未格式化。不知道是什么原因,可能是TFAT和FAT之间的区别吧。 

抱歉!评论已关闭.