FindFirstStore函數 按扇區讀取Windows Mobile的資料

來源:互聯網
上載者:User

按扇區讀取Windows Mobile的資料

http://dev.mmarket.com/cmdn/bbs/redirect.php?tid=114&goto=lastpost

        在行動裝置程式開發中,許多地方我們可以參考案頭電腦的開發方式,例如,MFC,不僅案頭電腦支援,而且基於Windows Mobile 5行動裝置也支援。
/ e: l) M# D5 S6 Y% s0 D  ~: s3 l; Y0 h# d
        由於行動裝置的體系架構與案頭電腦類似,都是由CPU,記憶體,非易失性儲存空間組成,因此,對於檔案系統管理等方面,將PC上的檔案系統引入到行動裝置是個非常不錯的選擇。比如,Windows Mobile 5,(基於windows ce 5.0的核心),就採用了TFAT32的檔案格式,相對於FAT32檔案系統,TFAT32增強了安全性。中國移動開發人員社區; m4 i) M1 F! k! M
7 U! q# ?7 m8 F+ /8 ?/ ^* p
        微軟的API中提供了CreateFile函數,這個對於從事編程的人員來說應該是非常熟悉不過的了,CreateFile函數不僅能夠操作檔案,還能操作各種IO裝置,比如磁碟,COM口等。由於Windows Mobile 5將整個非易失性儲存空間(往往是FLASH,下面就將非易失性儲存空間粗略地當成FLASH,並以此稱呼)劃分成若干個邏輯分區,往往是3個,作業系統區,資料備份區,使用者區。因此就可以使用CreateFile函數對這些邏輯磁碟操作了。& I! g2 P3 n3 s1 W8 z/ |# H
開發人員社區論壇: T  X; ]6 d0 J6 g: O
        首先,可以用FindFirstStore和FindnextStore函數尋找存放裝置,這些函數需要用到storemgr.h和storeapi.lib檔案,這兩個檔案在Windows Mobile 5的SDK中都有,用上述函數能夠得到存數裝置的裝置名稱,例如DSK:1等,這些將作為CreateFile的參數。我的裝置插上SD卡後得到的裝置名稱有四個,分別是DSK1:到DSK4:,其中DSK1是系統所在分區,檔案格式未知,DSK2為備份區,就是恢復出廠預設值的時候所用到的地區,DSK3是使用者資料區,我們平常存放的簡訊啊,音樂檔案啊都存放在這,也是使用者唯一能使用的地方,DSK4就是SD卡。dev.mmarket.com* m2 S" ?! /& w& P
6 B4 p! @7 f- d! G
用CreateFile開啟裝置後,不能用ReadFile去讀取資料,具體原因不清楚,可能是檔案系統驅動未提供支援吧。如何讀取資料?用DeviceIoControl函數,設定讀的標誌位DISK_IOCTL_READ,同時需要使用SG_REQ作為該函數的第三個參數,SG_REQ是一個結構體,裡面指明了需要讀取的磁碟的起始sector和讀取sector的數量,該結構體包含在Diskio.h中,不過Diskio.h檔案windows mobile 5.0的SDK沒有,我是從PB5.0中的目錄下拷貝過去的。" i( q0 T" l% j% J" [4 f
7 D" A$ F5 q2 @$ `6 T5 B) T) ?  @
        由於調用FindFirstStore函數和FindNextStore函數能夠擷取磁碟的扇區數,所以只要根據獲得的扇區數,就能完全讀取Windows Mobile各個磁碟的資料。之後將其寫入到隨身碟等裝置中,那麼開啟隨身碟就像開啟Windows Mobile裝置一樣了。不過其中發現了一個問題,讀取使用者區的資料之後,必須將頭部的512*2的位元組資料去掉,然後寫入隨身碟才能開啟隨身碟,不然會提示隨身碟未格式化。不知道是什麼原因,可能是TFAT和FAT之間的區別吧。 摘自:http://blog.163.com/wu_congchao/blog/static/354264720088253476730/  

void enumStore()
{
                STOREINFO  stinfo = {0};
                HANDLE  hPart  = INVALID_HANDLE_VALUE;
                HANDLE  hstore;
                TCHAR szInfo[100] = _T("");

                stinfo.cbSize = sizeof(STOREINFO);

                hstore = FindFirstStore(&stinfo);
                if(hstore!=INVALID_HANDLE_VALUE)
                {
                                do {
                                                 RETAILMSG(1,(TEXT("Partion number:%ld /n"),stinfo.dwPartitionCount ));
                                                 Size2String(stinfo.snNumSectors * stinfo.dwBytesPerSector,szInfo,100);
                                                 RETAILMSG(1,(TEXT("enumPartion:%s szInfo=%s/n"),stinfo.szDeviceName,szInfo));
                                                 Size2String(stinfo.dwBytesPerSector, szInfo, 100);
                                                 RETAILMSG(1,(TEXT("enumPartion:%s dwBytesPerSector=%s/n"),stinfo.szDeviceName,szInfo));

                                                 enumPartion(stinfo.szDeviceName,"//Hard Disk2//");

                                 } while(FindNextStore(hstore, &stinfo));
                }
                FindCloseStore(hstore);
}
LONGLONG enumPartion(LPCTSTR  deviceName,CString szPartionName )
{
                PARTINFO partInfo = {0};
                STOREINFO  stinfo = {0};
                HANDLE  hPart= INVALID_HANDLE_VALUE;
                HANDLE  hstore=INVALID_HANDLE_VALUE;

                TCHAR szInfo[100] = _T("");
 
                stinfo.cbSize = sizeof(STOREINFO);
                partInfo.cbSize = sizeof(PARTINFO);
 
                hstore = OpenStore(deviceName);
 
                if(INVALID_HANDLE_VALUE!=hstore)
                {
 
                                if(GetStoreInfo(hstore,&stinfo)==FALSE)

                                             return 0;

                                hPart=FindFirstPartition(hstore, &partInfo);
                                if(hPart==INVALID_HANDLE_VALUE)
                                                RETAILMSG(1,(TEXT("no find Partion info")));
                                if(hPart!=INVALID_HANDLE_VALUE)
                                {
 
                                             do {
                                                            RETAILMSG(1,(TEXT("enumPartion:%s /n"),partInfo.szVolumeName));
                                                            if(szPartionName.Right(1).Compare(_T("//"))==0)

                                                                           szPartionName=szPartionName.Left(szPartionName.GetLength()-1);
                                                            if(szPartionName.Compare(partInfo.szVolumeName)==0) 
                                                            {
                                                                           CloseHandle(hstore);
                                                                           FindClosePartition(hPart);
                                                                           return partInfo.snNumSectors*stinfo.dwBytesPerSector;
                                                            }
                                              } while(FindNextPartition(hPart, &partInfo));
                              }
                }
 CloseHandle(hstore);
 FindClosePartition(hPart);
 return 0L;

}
//

   得到磁碟空間 : http://blog.163.com/wu_congchao/blog/static/354264720088253465799/   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.