📄 fat_8c-source.html
字号:
00160 <span class="comment">//return 1;</span>00161 <span class="keywordflow">break</span>;00162 }00163 00164 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"First sector : "</span>); <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(PartInfo.prStartLBA); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00165 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Size : "</span>); <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(PartInfo.prSize); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00166 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"bytes/sector : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(bpb->bpbBytesPerSec); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00167 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"sectors/cluster : "</span>); <a class="code" href="group__rprintf.html#ga7">rprintfu08</a>(bpb->bpbSecPerClust); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00168 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"reserved sectors: "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(bpb->bpbResSectors); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00169 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"FatSectors : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(bpb->bpbFATsecs); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00170 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"BigFatSectors : "</span>); <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(bpb->bpbBigFATsecs); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00171 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Number of Fats : "</span>); <a class="code" href="group__rprintf.html#ga7">rprintfu08</a>(bpb->bpbFATs); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00172 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"First Fat Sector: "</span>); <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(FirstFATSector); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00173 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"First Data Sect : "</span>); <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(FirstDataSector); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00174 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"RootDirStartClus: "</span>); <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(RootDirStartCluster); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00175 <span class="preprocessor">#endif</span>00176 <span class="preprocessor"></span>00177 <span class="keywordflow">return</span> 0; 00178 }00179 <span class="comment"></span>00180 <span class="comment">//////////////////////////////////////////////////////////////</span>00181 <span class="comment"></span>00182 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> fatGetDirEntry(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> entry)00183 {00184 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> sector;00185 <span class="keyword">struct </span>direntry *de = 0; <span class="comment">// avoid compiler warning by initializing</span>00186 <span class="keyword">struct </span>winentry *we;00187 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> haveLongNameEntry;00188 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> gotEntry;00189 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> b;00190 <span class="keywordtype">int</span> i,index;00191 <span class="keywordtype">char</span> *fnbPtr;00192 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> entrycount = 0;00193 00194 <span class="comment">// read dir data</span>00195 sector = fatClustToSect(CurrentDirStartCluster);00196 00197 haveLongNameEntry = 0;00198 gotEntry = 0;00199 00200 index = 16; <span class="comment">// crank it up</span>00201 00202 <span class="comment">//while(entrycount < entry) </span>00203 <span class="keywordflow">while</span>(1)00204 {00205 <span class="keywordflow">if</span>(index == 16) <span class="comment">// time for next sector ?</span>00206 {00207 ataReadSectors( DRIVE0, sector++, 1, SectorBuffer);00208 de = (<span class="keyword">struct </span>direntry *) SectorBuffer;00209 index = 0;00210 }00211 00212 <span class="comment">// check the status of this directory entry slot</span>00213 <span class="keywordflow">if</span>(de->deName[0] == 0x00)00214 {00215 <span class="comment">// slot is empty and this is the end of directory</span>00216 gotEntry = 0;00217 <span class="keywordflow">break</span>;00218 }00219 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(de->deName[0] == 0xE5)00220 {00221 <span class="comment">// this is an empty slot</span>00222 <span class="comment">// do nothing and move to the next one</span>00223 }00224 <span class="keywordflow">else</span>00225 {00226 <span class="comment">// this is a valid and occupied entry</span>00227 <span class="comment">// is it a part of a long file/dir name?</span>00228 <span class="keywordflow">if</span>(de->deAttributes == ATTR_LONG_FILENAME)00229 {00230 <span class="comment">// we have a long name entry</span>00231 <span class="comment">// cast this directory entry as a "windows" (LFN: LongFileName) entry</span>00232 we = (<span class="keyword">struct </span>winentry *) de;00233 00234 b = WIN_ENTRY_CHARS*( (we->weCnt-1) & 0x0f); <span class="comment">// index into string</span>00235 fnbPtr = &FileNameBuffer[b];00236 <span class="keywordflow">for</span> (i=0;i<5;i++) *fnbPtr++ = we->wePart1[i*2]; <span class="comment">// copy first part</span>00237 <span class="keywordflow">for</span> (i=0;i<6;i++) *fnbPtr++ = we->wePart2[i*2]; <span class="comment">// second part</span>00238 <span class="keywordflow">for</span> (i=0;i<2;i++) *fnbPtr++ = we->wePart3[i*2]; <span class="comment">// and third part</span>00239 <span class="keywordflow">if</span> (we->weCnt & WIN_LAST) *fnbPtr = 0; <span class="comment">// in case dirnamelength is multiple of 13, add termination</span>00240 if ((we->weCnt & 0x0f) == 1) haveLongNameEntry = 1; <span class="comment">// flag that we have a complete long name entry set</span>00241 }00242 <span class="keywordflow">else</span>00243 {00244 <span class="comment">// we have a short name entry</span>00245 00246 <span class="comment">// check if this is the short name entry corresponding</span>00247 <span class="comment">// to the end of a multi-part long name entry</span>00248 <span class="keywordflow">if</span>(haveLongNameEntry)00249 {00250 <span class="comment">// a long entry name has been collected</span>00251 <span class="keywordflow">if</span>(entrycount == entry) 00252 {00253 <span class="comment">// desired entry has been found, break out</span>00254 gotEntry = 1;00255 <span class="keywordflow">break</span>;00256 }00257 <span class="comment">// otherwise</span>00258 haveLongNameEntry = 0; <span class="comment">// clear long name flag</span>00259 entrycount++; <span class="comment">// increment entry counter </span>00260 }00261 <span class="keywordflow">else</span>00262 {00263 <span class="comment">// entry is a short name (8.3 format) without a</span>00264 <span class="comment">// corresponding multi-part long name entry</span>00265 fnbPtr = FileNameBuffer;00266 <span class="keywordflow">for</span> (i=0;i<8;i++) *fnbPtr++ = de->deName[i]; <span class="comment">// copy name</span>00267 *fnbPtr++ = <span class="charliteral">'.'</span>; <span class="comment">// insert '.'</span>00268 <span class="keywordflow">for</span> (i=0;i<3;i++) *fnbPtr++ = de->deExtension[i]; <span class="comment">// copy extension</span>00269 *fnbPtr = 0; <span class="comment">// null-terminate</span>00270 00271 <span class="keywordflow">if</span>(entrycount == entry) 00272 {00273 <span class="comment">// desired entry has been found, break out</span>00274 gotEntry = 1;00275 <span class="keywordflow">break</span>;00276 }00277 <span class="comment">// otherwise</span>00278 entrycount++; <span class="comment">// increment entry counter </span>00279 }00280 }00281 }00282 <span class="comment">// next directory entry</span>00283 de++;00284 <span class="comment">// next index</span>00285 index++;00286 }00287 00288 <span class="comment">// we have a file/dir to return</span>00289 <span class="comment">// store file/dir starting cluster (start of data)</span>00290 FileInfo.StartCluster = (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) ((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)de->deHighClust << 16) + de->deStartCluster;00291 <span class="comment">// store file/dir size</span>00292 <span class="comment">// (note: size field for subdirectory entries is always zero)</span>00293 FileInfo.Size = de->deFileSize;00294 <span class="comment">// store file/dir attributes</span>00295 FileInfo.Attr = de->deAttributes;00296 <span class="comment">// store file/dir creation time</span>00297 FileInfo.CreateTime = de->deCTime[0] | de->deCTime[1]<<8;00298 <span class="comment">// store file/dir creation date</span>00299 FileInfo.CreateTime = de->deCDate[0] | de->deCDate[1]<<8;00300 00301 <span class="keywordflow">return</span> gotEntry;00302 }00303 00304 <span class="comment">// change directory into </span>00305 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> fatChangeDirectory(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> entry)00306 {00307 <span class="comment">// get the requested directory entry</span>00308 <span class="keywordflow">if</span>( fatGetDirEntry(entry) )00309 {00310 <span class="comment">// make sure the entry is a directory</span>00311 <span class="keywordflow">if</span>(FileInfo.Attr & ATTR_DIRECTORY)00312 {00313 <span class="comment">// change directories into this directory</span>00314 <span class="comment">// check to see if we are changing back to root directory</span>00315 <span class="keywordflow">if</span>(FileInfo.StartCluster)00316 {00317 <span class="comment">// standard change directory</span>00318 CurrentDirStartCluster = FileInfo.StartCluster;00319 }00320 <span class="keywordflow">else</span>00321 {00322 <span class="comment">// if startCluster pointer is zero,</span>00323 <span class="comment">// a change to the root directory is intended</span>00324 <span class="comment">// change directory to root</span>00325 CurrentDirStartCluster = RootDirStartCluster;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -