プログラムに何を要求しますか?
はい、実際にはそれほどではありません。 開発中のプログラムは、NTFS5ファイルシステムを備えたハードディスクのパーティションからFATパーティションにコピーする必要があります。 このプログラムは、Windows 2000(NTFS 5を使用)が見つからないかアクセスできない場合に使用する必要があります。 長いファイル名、および任意の容量のハードドライブ(8GB以上を含む)をサポートする必要があります。 機能環境-OS DOS、Windows 9x。 プログラムには、「標準」の2パネル「ノートン」インターフェースが必要です。
アルゴリズムを決めましょう
プログラムを起動すると、既存のパーティションのリストが画面に表示され、ハードディスク、パーティションのタイプ、パーティションのサイズが示されます。 デフォルトでは、NTFS以外のタイプのパーティションの選択は禁止されています(適切なメッセージが表示されます)。 タイプNTFSのパーティションを選択する場合、署名をチェックして、NTFSパーティションかどうかを判断します。 不一致の場合、対応するメッセージが発行されます。 パーティションがNTFSとして認識されている場合、2つのファイルパネルが表示されます。 左側のペインには、NTFSパーティションのルートディレクトリにあるファイルとディレクトリのリストが表示されます。 右側には、現在の論理ドライブの現在のディレクトリの内容が表示されます。
ユーザーは必要なアクション(パーティションファイルの表示、NTFSパーティションからFATパーティションへのコピーなど)を実行し、プログラムを終了します。
ここではすべてがどのように配置されていますか
プログラムが起動すると、システムにあるすべてのハードドライブのパラメーターが決定されます。 定義済み:ジオメトリ、ボリューム、および高度な読み取りおよび書き込み機能のサポート。 各ドライブの結果は、次の構造に記録されます。
struct sDrvInfo { unsigned char Drive; // (80h..FFh) unsigned char ExtSupp; // Int13 Ext (0 - ) unsigned short NumCyl; // unsigned short NumHead; // unsigned short NumSect; // unsigned long NumAll; // sDrvInfo *Next; // };
標準の読み取り/書き込み機能(13h割り込みの02hおよび03h機能を介して実装)では、3次元のセクター番号(トラックヘッドセクター)の表示が必要であり、8 GB以下の容量のハードドライブでのみ動作します。 高度な機能(Int13 Ext)(42hおよび43h割り込み13h)を使用すると、絶対セクター番号を指定し、任意のサイズのハードドライブで作業できます。 したがって、このようなサポートにより、セクターの読み取りはこれらの機能を介してのみ実行されます。
次に、各ハードディスクについて、そこにあるパーティションが決定されます。 各セクションの結果は、構造に記録されます。
struct sPartInfo { unsigned char Drive; // (80h..FFh) unsigned char Type; // unsigned long Start; // unsigned long Size; // unsigned long Table; // // , unsigned char NumEnt; // sPartInfo *Next; // };
拡張パーティションの存在は一般的な場合にツリーを提供するため、パーティション検索手順は再帰的です。 拡張パーティションには、05h(HDD <= 8GBの場合)または0Fh(HDD> 8GBの場合)の2種類があります。 2番目の場合、セクションへのアクセスはInt13 Extを介してのみ可能です。
FAT論理ディスクでの作業は標準的な方法(割り込み21h経由)で実行されたため、関心がありません。 長いファイル名がサポートされているかどうかに応じて、標準機能または割り込み21hのグループ71hの機能が使用されることに注意してください。
NTFSパーティションの操作は、すべての構造の手動分析に基づいています。 NTFS構造に従って、セクション分析シーケンスは次のとおりです(注:各MFTレコードまたはインデックスブロックを読み取った後、修正領域は必ず修正されます。詳細については、NTFS構造を参照してください)。
1.パーティションのブートセクターから2つの重要なパラメーターが抽出されます。クラスターごとのセクター数と、MFTが始まるクラスター番号です。
2. MFTレコード番号3(ボリュームに関する情報)が読み取られ、そこからボリュームの名前(ラベル)を抽出しようとします。 障害が発生した場合、ボリュームにはラベルがないと見なされます。
3. MFTレコード番号5(ルートディレクトリ)を読み取ります。 ファイルとディレクトリのリストは、それに含まれるインデックスを使用して作成されます。
4.ディレクトリ(上または下)に変更すると、必要なディレクトリを担当するMFTレコードが読み取られ、そこからインデックスも抽出されます。
5.ファイルにアクセスするとき(たとえば、読み取り用)、指定されたファイルを担当するMFTレコードが読み取られて分析されます。
興味深い場合は、さらに詳しく説明します。 ソースコードはこちらです。
PS:
zipのソースコードはこちらです。
そして、写真では次のようになります。