2

FAT32ファイルシステムイメージを移動できるプログラムをCで作成しようとしています。しかし、正しいデータを収集するための方程式を理解して適用するのに苦労しています。私はLinuxのDebianディストリビューションを使用しているので、リトルエンディアン形式が維持されます。以下は、FAT32に関するMicrosoft Webサイトの擬似コードであり、ディレクトリまたはファイルにアクセスする次のクラスターを計算します。

    ThisFATSecNum = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
    ThisFATEntOffset = REM(FATOffset / BPB_BytsPerSec);

    FAT32ClusEntryVal = FAT32ClusEntryVal & 0x0FFFFFFF;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) =
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0xF0000000;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) = 
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) | FAT32ClusEntryVal;

SecBuff文字配列が何をしているのか、何にアクセスしているのかを完全には理解していません。DWORDはunsignedintであると想定されており、後続のキャストも理解できません。どんな光の小屋も大歓迎です。

クラスターに基づいてFAT32ファイルシステムをどのように移動するかについて誰かが説明できれば、非常にありがたいです。クラスターの割り当てによって空間的な局所性が確保されている場合でも、セクターを参照する方が効果的であるように思われます。ファイル/フォルダーの次のクラスターを見つけるためにバイト読み取りを行う方法を完全には理解していません。

4

1 に答える 1

7

この擬似コードは、ファイルアロケーションテーブルとの間でクラスター番号を読み書きするためのものです。ドキュメントには、2つの擬似コードの間にあると書かれています。FAT12 / 16/32がどのように機能するかについて少しも理解していない限り、ここでの唯一の可能性です。

------8 <------

これがSecBuffという名前の8ビットバイト配列に読み込まれると仮定します。また、タイプWORDが16ビットの符号なしであり、タイプDWORDが32ビットの符号なしであると想定します。

If(FATType == FAT16)
    FAT16ClusEntryVal = *((WORD *) &SecBuff[ThisFATEntOffset]);
Else
    FAT32ClusEntryVal = (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0x0FFFFFFF;

そのクラスターのコンテンツをフェッチします。この同じクラスターの内容を設定するには、次のようにします。

If(FATType == FAT16)
    *((WORD *) &SecBuff[ThisFATEntOffset]) = FAT16ClusEntryVal;
Else {
     FAT32ClusEntryVal = FAT32ClusEntryVal & 0x0FFFFFFF;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) =
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0xF0000000;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) = 
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) | FAT32ClusEntryVal;
}

------8 <------

上記の擬似コードが操作するセル内のこれらのクラスター番号は次のとおりです。

ここに画像の説明を入力してください

彼らは、次のファイル部分が(もしあれば)どこのクラスターにあるかを言います。すべてのファイルまたはディレクトリは、クラスターのチェーンです。

SecBuffファイルアロケーションテーブルの512バイト長のセクターを含む配列です。キャストは、*((DWORD *)32ビット値を別々の8ビット部分で読み書きすることを避けるためにあります。

于 2011-12-12T05:03:25.067 に答える