• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:FAT12ファイルシステムに関する問題。)

FAT12ファイルシステムに関する問題

このQ&Aのポイント
  • FAT12ファイルシステムに関する問題についての要約
  • FAT12ファイルシステムでのクラスタ番号の書き込み方法について探しています
  • C言語とWin32APIを使用して、FAT12ファイルシステムでのディスクへの書き込み処理を実装する方法についてアドバイスをお願いします

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

まず第一の問題は「FATへのクラスタ番号の書き込みを関数にしてない」のが問題。 第二の問題は「何故第2FATを書かないのか」と言う事。 第三の問題は「ルートディレクトリは書かないのか?」と言う事。 とりあえず「第一の問題」だけ回答。 //先頭から順番に書き込まず、ランダムに書く場合は、コメントした行を使う void WriteFAT12(byte *fat,int CNo,int WData) {  byte *p = &fat[CNo * 3 / 2]; //書き込み位置を求める  if (CNo & 1) { //クラスタ番号が奇数か偶数か // *p = (*p & 0x0f) | (WData & 0xf0); //1バイト目   *p |= WData & 0xf0; //1バイト目   *++p = (WData >> 4); //2バイト目  } else {   *p++ = WData & 0xff; //1バイト目 // *p = (*p & 0xf0) | ((WData >> 8) & 0x0f); //2バイト目   *p = (WData >> 8) & 0x0f; //2バイト目  } } int i; WriteFAT12(fat, 0, 0xFF8);//0番目のクラスタ(予約) WriteFAT12(fat, 1, 0xFFF);//1番目のクラスタ(予約) for (i = 1; i < clust; i++) {//クラスタサイズの-1分までインクリメント     WriteFAT12(fat, i + 1, i + 2);//n番(2番から始まる)のクラスタにn+1のクラスタ番号を書き込んでいく } WriteFAT12(fat, clust + 1, 0xFFF);//最後のクラスタに終了マークを書き込む いちいちclustが1か1以外か場合分けする必要はない。「clustが1ならループを回らないforループ」と「clustが1だろうが何だろうが、最後のクラスタにFFFを書き込む」と書けば済む。

kenji_aki
質問者

お礼

お手本を示していただいたコードを元に 自分なりに書き直してみた結果です。 ((pword)fat)[0] |= 0x0FF0; *((pword)&fat[1]) |= 0xFFF0; for (i=1; i<clust; i++) {     clustNo = ((i+1)*3)>>1;     if (i & 0x01) {         *((pword)&fat[clustNo]) |= (i+2);     } else {         *((pword)&fat[clustNo]) |= (i+2) << 4;     } } clustNo = ((i+1)*3)>>1; if (i & 0x01) *((pword)&fat[clustNo]) = 0x0FFF; else *((pword)&fat[clustNo]) = 0xFFF0; >>start.. A Drive was Opened. Boot sector was Read. System file was Read. Size of system file. [3168] Size put together on sector boundary. [3584] Necessary number of clusters. [7] つたない英語はお許しください。 F0 FF FF 03 40 00 05 60 00 07 80 00 FF 0F 00 00 一応、期待通りに動いたみたいです。 大変参考になるコードを示していただき感謝いたします。 ありがとうございました。

kenji_aki
質問者

補足

>「FATへのクラスタ番号の書き込みを関数にしてない」 これは、限られた条件の(初期化された状態で2番のクラスタから順番にかきこむ)ため 関数化の必要を感じていなかった訳です。 >「何故第2FATを書かないのか」 バッファを1stFATへ書き込んだ後に2ndFATに書き込むつもりでした。 >「ルートディレクトリは書かないのか?」 初期化された状態で書き込むので、ルートディレクトリエントリの最初に構造体を書き込もうと思っています。 何も書き込まれていないのが条件なので、特に問題は無いと思ってます。 >いちいちclustが1か1以外か場合分けする必要はない。 言われてから気づきました。 そうですよね、よく考えたらわざわざ処理分けする必要なんてありませんでした。 ご指摘ありがとう御座います。

その他の回答 (2)

回答No.3

おっと。シフトすんの忘れてる。 誤 >// *p = (*p & 0x0f) | (WData & 0xf0); //1バイト目 >  *p |= WData & 0xf0; //1バイト目 正 <// *p = (*p & 0x0f) | ((WData << 4) & 0xf0); //1バイト目 <  *p |= (WData << 4) & 0xf0; //1バイト目

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

クラスタ番号を書き込むときに, 次に書き込むべき位置が「バイト境界にそろっているかどうか」を判断するフラグが 1個必要ではないでしょうか. そして, バイト境界に揃っているのであれば fat[i++] = cluster & 0xff; fat[i] = cluster >> 8; 揃っていなければ fat[i++] |= (cluster & 0x0f) << 4; fat[i++] = cluster >> 4; という処理になるかと. もちろん, 処理するごとにフラグを反転させる必要があります. また, 512バイトを超えちゃったときの処理も別途必要かもしれません.

関連するQ&A