OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / volume / fat / fatvol_clusterread.c
1 #include "fatvol_local.h"
2
3
4 /** クラスタ読み込み */
5 int FatVol_ClusterRead(
6                 C_FATVOL    *self,
7                 FATVOL_UINT uiCluster,
8                 void        *pBuf)
9 {
10         FATVOL_UINT uiPos;
11         FATVOL_UINT uiSize;
12
13         if ( uiCluster >= 0xffff0000 && (self->iFatType == FATVOL_TYPE_FAT12 || self->iFatType == FATVOL_TYPE_FAT16) )
14         {
15                 /* FAT12/16 のルートディレクトリを 0xf0000000 にマップ */
16                 uiCluster -= 0xf0000000;
17                 
18                 /* 読み出し位置移動 */
19                 uiPos = (self->uiRootDirSector + (uiCluster * self->uiSectorsPerCluster)) * self->uiBytesPerSector;
20                 if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
21                 {
22                         return FATVOL_ERR_NG;
23                 }
24                 
25                 /* 読み出し */
26                 uiSize = self->uiBytesPerSector * self->uiSectorsPerCluster;
27                 if ( File_Read(self->hBlockFile, pBuf, uiSize) != uiSize )
28                 {
29                         return FATVOL_ERR_NG;
30                 }
31         }
32         else
33         {
34                 /* 読み出し位置移動 */
35                 uiPos = (self->uiCluster0Sector + (uiCluster * self->uiSectorsPerCluster)) * self->uiBytesPerSector;
36                 if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
37                 {
38                         return FATVOL_ERR_NG;
39                 }
40
41                 /* 読み出し */
42                 uiSize = self->uiBytesPerSector * self->uiSectorsPerCluster;
43                 if ( File_Read(self->hBlockFile, pBuf, uiSize) != uiSize )
44                 {
45                         return FATVOL_ERR_NG;
46                 }
47         }
48         
49         return FATVOL_ERR_OK;
50 }
51
52
53 /* end of file */