最近追踪一个磁盘碎片整理的bug,追踪了下控制面板里面的存储管理器的相关功能,与大家分享一下,希望对大家有帮助
控制面板中存储管理器的源码在WINCE600\PUBLIC\WCESHELLFE\OAK\CTLPNL\STGUI
我们都知道,存储管理器会首先列出现有的存储设备,比如NAND和SD等
也就是相对应的DSK1,DSK2等存储设备
然后选择了一个存储设备之后,会显示其上相应的分区信息,如part00,part01等
这里可以对存储设备进行一些例如格式化、新建删除分区等操作
在分区的属性页里面,可以看到分区名字,大小,类型,文件系统等
还可以进行加载,卸载,格式化,扫描,以及整理操作
大家打开maindlg.cpp就可以看到首页上大部分的功能都在这里
那么存储管理器是如何获取所有存储设备及分区的信息的呢
看几个重要的函数,首先是RefreshStoreList
里面可以看到,首先是FindFirstStore,获取store的信息。一个Store就是一个存储设备,就是我们说的DSK1,DSK2等
Store的信息全部在一个STOREINFO类型的结构体里面
然后调用FindNextStore来继续遍历剩余的Store
获取一个Store上面所有的partition列表的函数在RefreshPartitionList
大家可以看到,和RefreshStoreList的操作非常类似,只不过首先需要打开一个Store,就是调用OpenStore
然后FindFirstPartition获取第一个part的信息,存放在结构体PARTINFO中
然后调用FindNextPartition遍历所有part
这些示例代码对我们获取系统的存储设备信息非常有用
后面对于partition的操作我们举个磁盘整理的例子
首先追踪打开part的属性页的函数,即GetSelectedPartProps,可以看到,对于属性页中的操作,都是调用PartInfoDlgProc
该函数在partinfodlg.cpp中,可以很容易找到,进行defrag的函数是DefragSelectedPart
这里我们发现,调用了外部的函数DefragVolumeUI
这个函数是在fatutil.dll里面,源码主要在\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\FSD\FATUTIL,在UI目录下的defragdlg.cpp中可以找到DefragVolumeUI
fatutil.dll的生成在\WINCE600\PUBLIC\COMMON\CESYSGEN的makefile文件中
由于时间有限,所以只是简单的介绍下各关键流程,希望可以对大家有所帮助
浙公网安备 33010602011771号