0

基本的にfdiskvdisk'p'コマンドと同じように機能する独自のCプログラムを作成しようとしています。ディスクの最初の512バイトを読み取って、(0x1BE)のパーティションの先頭を調べてから、パーティションのタイプ、名前、サイズなどを読み取れるようにしたいだけです。これらの値を実際に読み取る方法がわかりません。read()linux関数を使用して512バイトを読み取りましたが、何らかの方法でそれらを表示/表示しようとすると、何も表示されません。私は何が間違っているのですか?

int main(int argc, char *argv[]) {
    int bytes_read;
    char mbr[512];
    int file;
    if(argc == 1) {
        // Print some help info
        printf ("Here is some help info: \n\n");
    } else if(argc < 3) {
        printf("File: %s\n\n", argv[1]);
        file = open(argv[1], O_RDONLY);
        lseek(bytes_read, 0, 0);
        //First get the MBR
        bytes_read = read(file, mbr, 512);
        printf("MBR=%s\n\nbytes_read=%d\n\n", mbr, bytes_read);
    } else {
        printf ("Incorrect usage: fdisk <disk>\n\n");
    }
}
4

2 に答える 2

3

printfバイナリデータで使用しようとしないでください。バイナリデータがNUL(ASCII 0)で始まる場合、printfは空の文字列があると見なします。を使用write()して任意のデータを書き出すことができます(バッファーと長さが必要です)。例:

#include <unistd.h>

write(STDOUT_FILENO, mbr, 512)

...ただし、端末が出力内の制御文字を解釈しようとする可能性があるため、これでも必ずしも有用なものが表示されるとは限りません。その場合、出力をまたはのようなものにパイプするのが最善の策です。xxdどちらodも入力データの16進ダンプを生成します。

たとえば、ローカルドライブの最初の512バイトはすべてNULです。コードで使用write()する(そしてそれを削除するlseek)と、出力で512NULバイトになります。ディスク以外のものをコードに渡してみてください。例:

myexe /etc/passwd

標準のDOSMBRの構造はここに記載されており、次のようなデータ構造から始めることをお勧めします。

struct _partition {
        uint8_t         status;
        uint8_t         chs_start[3];
        uint8_t         part_type;
        uint8_t         chs_end[3];
        uint32_t        lba_start;
        uint32_t        sectors;
};

そして、次のように入力します。

        fd = open(target, O_RDONLY);
        lseek(fd, 446, SEEK_SET);
        for (i=0; i<4; i++) {
                struct _partition p;

                bytes_read = read(fd, &p, sizeof(struct _partition));

                // assume this prints information to stdout or something.
                print_part(i, &p);
        }
于 2013-01-16T01:23:41.280 に答える
0

を取り除きlseekます。コンパイラは、bytes_read初期化されていない引数()を渡しているため、今すぐ警告をスローするはずです。

それが終わったら、内容を表示するために何かをする必要があります。現在、読み取ったデータを使用するものは何もありません。

于 2013-01-16T01:23:44.900 に答える