0

我正在尝试构建我自己的 C 程序,它基本上就像 fdisk vdisk 'p' 命令一样工作。我只想能够读取磁盘的前 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)

...但即使这样也不一定会显示任何有用的信息,因为您的终端可能会尝试解释输出中的控制字符。最好的办法是将输出通过管道传输到xxdor之类的东西od,这两者都会产生其输入数据的十六进制转储。

例如,我本地驱动器的前 512 个字节都是NUL. 在您的代码中使用write()(并删除它lseek)会导致NUL输出 512 个字节。尝试将磁盘以外的其他内容传递给您的代码,例如:

myexe /etc/passwd

这里记录了标准 DOS MBR 的结构,建议您可以从以下数据结构开始:

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 回答