2

プログラムを作成していて、マウントした FAT32 ファイル システムに関するブート セクタの情報にアクセスする必要があります。

これが私がしたことで、完全にコメントされています。

int main (void) {
    unsigned short *i;                  //2 byte unsigned integer pointer
    char tmp[1024];                     //buffer
    int fd;                             //file descriptor from opening device
    fd =  open("/dev/sdf", O_RDONLY);   //open the device file
    lseek(fd, 14, SEEK_SET);            //set offset to 14 (0x0E), i.e. storing "no. of reserved sectors" of the FAT32 system
    read(fd, tmp, 2);                   //read off 2 bytes, "no. of reserved sectors" is represented by 2 bytes
    i = &tmp;                           //point j at those 2 bytes
    printf("*j: %d\n", *j);             //print *j out
    close(fd);                          //close device
    return 0;
}

*i の出力は 38 であり、ナンセンスです。ファイルシステムを mkfs.vfat でフォーマットしました。「予約セクタ数」を 32 に設定しました。

私が試したこと:

  • i = (unsigned short *) &tmp、キャストを行います。これにより、コンパイル時に警告が削除されますが、役に立ちません

  • read(fd, tmp, 512)、ブート セクタ全体 (512 バイト) を tmp にロードし、バッファから読み取りますが、役に立たず、結果は 38 のままです。

  • インデックスを間違えた場合に備えて、オフセットを調整します。つまり、14 を 13 または 15 に変更します。13 の場合は 9744、15 の場合は 512 とそれぞれ出力されるため、動作しません。

正しい方法で行っているかどうかはわかりません。誰かが私を正しい方向に向けることができますか?

前もって感謝します、

フェラスティン。

4

2 に答える 2

0

実行してみてください:

$ dd if=/dev/sdf of=/tmp/x.bin bs=512 count=1

その後:

$ hd /tmp/x.bin

または

$ od -tx2 /tmp/x.bin

そして、最初の行を投稿します。

あなたのfattoolsが独自の6つの予約済みセクターを追加している可能性があります。そして、データを表示する前にそれらを減算します。

于 2011-12-21T14:37:57.723 に答える
-1
unsigned short *i;                  //2 byte unsigned integer pointer
char tmp[1024];  
 [...] 
i = &tmp;                           //point j at those 2 bytes

tmpchar[]&tmp何か秩序のあるものですchar**。もう一度考えてみてください、あなたは&ここを望んでいません。

于 2011-12-22T07:36:57.510 に答える