ISO镜像本身不是某种数据格式,只不过是逐个复制一张光盘上的数据扇区。ISO也可以被释放的驱动程序软件「挂载」,模拟出一个物理硬盘让操作系统读取。

MBR

master boot record(主引导记录):是硬盘的第一个扇区,第一个扇区也叫做mbr扇区。

偏移地址 字节数 内容
00 446 启动代码
446 16 第1分区表项
462 16 第2分区表项
478 16 第3分区表项
494 16 第4分区表项
510 2 签名(0x55 0xAA)

看上边的结构图可以看到,一个mbr分区的大小就是512字节。其中包括446字节的启动代码,4x16的四个分区表项,最后是两个字节的签名。也就是要确定一个iso是不是mbr类型的镜像,打开ISO文件,偏移510字节,再读俩字节,这俩字节中的内容如果是「0x55 0xAA」,那么这就是一个mbr类型的镜像。
编程实现部分:

  1. bool
  2. Page1::checkISO(const QString fileName){
  3. // Check if there's an MBR signature
  4. // MBR signature will be in last two bytes of the boot record
  5. QByteArray mbr;
  6. QFile mbrTest(fileName);
  7. mbrTest.open(QIODevice::ReadOnly);
  8. mbrTest.seek(510);
  9. mbr = mbrTest.read(2);
  10. mbrTest.close();
  11. if (mbr.toHex() != "55aa"){ //MBR signature "55aa"
  12. qDebug()<<"wrong iso,filename = "<<fileName<<"MBR signature = "<<mbr.toHex();
  13. return false;
  14. }
  15. return true;
  16. }

qt实现的,总之就是读偏移了510字节之后那俩字节。

GPT

image.png
再看GPT,第一个扇区是PMBR,格式与mbr相同。
偏移上一个扇区,也就是偏移上512kb之后,就是GPT Header,也是512K之后接下来的512K,就是GPT Header的部分,GPT Header的内容如下:
image.png
偏移512k之后读上8k转string,内容为「EFI PART」则代表这是一个GPT分区。内容基本一致,就不编码了。