C 读取虚拟磁盘的方法&x27;s膜生物反应器

C 读取虚拟磁盘的方法&x27;s膜生物反应器,c,linux,disk-partitioning,mbr,C,Linux,Disk Partitioning,Mbr,我正在尝试构建自己的C程序,它基本上与fdisk vdisk'p'命令一样工作。我只想能够读取磁盘的前512字节,lseek到分区的开头(0x1BE),然后读取分区类型、名称、大小等。我不确定如何实际读取这些值。我使用read()linux函数读取512字节,但当我尝试以任何方式显示/查看它们时,都没有显示任何内容。我做错了什么 int main(int argc, char *argv[]) { int bytes_read; char mbr[512]; int fi

我正在尝试构建自己的C程序,它基本上与fdisk vdisk'p'命令一样工作。我只想能够读取磁盘的前512字节,lseek到分区的开头(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");
    }
}
intmain(intargc,char*argv[]){
读取整数字节;
char-mbr[512];
int文件;
如果(argc==1){
//打印一些帮助信息
printf(“这里有一些帮助信息:\n\n”);
}否则如果(argc<3){
printf(“文件:%s\n\n”,argv[1]);
文件=打开(argv[1],仅限ordu);
lseek(字节读取,0,0);
//首先得到MBR
字节\读=读(文件,mbr,512);
printf(“MBR=%s\n\n字节\u读取=%d\n\n”,MBR,字节\u读取);
}否则{
printf(“不正确的用法:fdisk\n\n”);
}
}

不要尝试对二进制数据使用
printf
。如果二进制数据以
NUL
(ASCII 0)开头,则printf将假定您有一个空字符串。您可以使用
write()
写出任意数据(需要缓冲区和长度),例如:

标准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);
        }
然后像这样填充它:

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);
        }
fd=open(仅适用于目标);
lseek(fd,446,搜索集);

对于(i=0;i不要尝试对二进制数据使用
printf
。如果二进制数据以
NUL
(ASCII 0)开头,则printf将假定您有一个空字符串。您可以使用
write()
写出任意数据(需要缓冲区和长度),例如:

标准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);
        }
然后像这样填充它:

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);
        }
fd=open(仅适用于目标);
lseek(fd,446,搜索集);

对于(i=0;i摆脱
lseek
。当您向它传递一个尚未初始化的参数(
bytes\u read
)时,编译器应该立即抛出一个警告


完成后,您需要做一些事情来显示内容;现在,您没有任何东西可以使用您读取的数据。

摆脱
lseek
。您的编译器应该立即发出警告,因为您正在向它传递一个尚未初始化的参数(
bytes\u read


完成后,您需要做一些事情来显示内容;现在,您没有任何东西可以使用您读取的数据。

好的,您正在读取18个字节。如果是块设备,您可能需要读取整个块(512b).一开始我让它这么做..让我把代码改成我是怎么做的before@YannRamin因此,我将代码改为512字节。即使我打印此代码,它仍然没有显示任何内容。好的,您正在读取18字节。如果是块设备,您可能需要读取整个块(512b).一开始我让它这么做..让我把代码改成我是怎么做的before@YannRamin因此,我将代码改为512字节。即使我打印它,它仍然显示我可以十六进制转储的内容,但这仍然不能帮助我读取分区属性的实际值。我必须解析原始二进制数据吗?…当然!你期待什么?分区图是一个二进制结构;您需要准确地读取结构的外观,创建必要的C数据结构,根据需要填充它们,并编写函数以生成人类可读的输出。感谢所有的帮助。我理解所有这些是如何工作的,唯一要做的是找到一种以纯文本而不是文本形式打印它的方法有什么特殊的方法可以做到这一点吗?好吧,使用我建议的数据结构,您可以执行类似于
printf(“Type:%d\n”,part->part\u Type)的操作
,假设
部分
是一个
结构分区*
。我可以进行十六进制转储,但这仍然不能帮助我读取分区属性的实际值。我必须解析原始二进制数据吗?…当然!你期望什么?分区映射是一个二进制结构;你需要准确地读取结构的外观例如,创建必要的C数据结构,根据需要填充它们,并编写函数以生成人类可读的输出。感谢所有的帮助。我了解所有这些工作原理,唯一的问题是找到一种以纯文本而不是二进制打印的方法。有什么特殊的方法可以做到这一点吗?嗯,使用像我这样的数据结构建议您执行类似于
printf(“类型:%d\n”,part->part\u类型)
,假设
part
是一个
struct\u分区*