开源ext2read代码走读之-如何读取MBR分区的内容

主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。

主引导扇区记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息,是数据信息的重要入口。如果它受到破坏,硬盘上的基本数据结构信息将会丢失,需要用繁琐的方式试探性的重建数据结构信息后才可能重新访问原先的数据。主引导扇区内的信息可以通过任何一种基于某种操作系统的分区工具软件写入,但和某种操作系统没有特定的关系,即只要创建了有效的主引导记录就可以引导任意一种操作系统(操作系统是创建在高级格式化的硬盘分区之上,是和一定的文件系统相联系的)。

主引导记录的组成

|=======================|

|地址   描述                 长度       |

|-----------------------------------------|

|0x00    代码区        440            |

|-----------------------------------------|

|0x01B8 选用磁盘标志  4          |

|---------------------------------------- |

|0x01BC 一般为空值    2           |

|---------------------------------------- |

|0x01BE    标准MBR分区表 64  |

|     4个16B的主分区表               |

|----------------------------------------- |

|0xFE   MBR Magic 0x55AA      |

|              Number                       |

|========================|

硬盘分区结构表:

上图中的0x01BE开始的64个字节是4个主分区表,一个分区表的结构为:

|=============================|

|offset   len        info                               |

|---------------------------------------------------|

|0x00     1  此分区状态                          |

|---------------------------------------------------|

|0x1     1  此分区起始磁头号                  |

|---------------------------------------------------|

|0x2     1  此分区起始扇区号                  |

|---------------------------------------------------|

|0x3     1  此分区起始磁柱号                  |

|---------------------------------------------------|

|0x4     1  文件系统标志位                     |

|---------------------------------------------------|

|0x5     1  此分区结束磁头号                 |

|---------------------------------------------------|

|0x6     1  此分区结束扇区号                  |

|---------------------------------------------------|

|0x7     1  此分区结束磁柱号                  |

|---------------------------------------------------|

|0x8     4  分区起始相对扇区号              |

|---------------------------------------------------|

|0xC     4  分区总的扇区数                     |

|=============================|

如何读取MBR分区的内容:

首先,需要打开硬盘设备,然后再从设备中读取第1个扇区的内容,即是MBR的内容,

HANDLE handle;

DISK_GEOMETRY dsk;

BOOL bResult;

DWORD junk;

//如果只是进行读的操作,在打开设备的时候,使用GENERIC_READ权限进行读的操作权限的设置;

/*

handle = CreateFileA(path, GENERIC_READ,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING,

0, 0 );

*/

//若需要进行读写、执行的操作,在打开设备的时候,使用GENERIC_ALL权限字进行打开

handle = CreateFileA(path, GENERIC_ALL,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING,

0, 0 );

if(handle == INVALID_HANDLE_VALUE)

{

return handle;

}

//获取设备的一个扇区的字节数,一般均为512Byte

bResult = DeviceIoControl(handle,  // device we are querying

IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform

NULL, 0, // no input buffer, so pass zero

&dsk, sizeof(dsk),  // output buffer

&junk, // discard count of bytes returned

(LPOVERLAPPED) NULL);  // synchronous I/O

if((!bResult) || (dsk.BytesPerSector < SECTOR_SIZE))

*sect_size = SECTOR_SIZE;

else

//dsk.BytesPerSector是当前硬盘设备的扇区大小

*sect_size = dsk.BytesPerSector;

再使用read_disk读取一个扇区的数据。

//hnd为设备的句柄,ptr为存储第一个扇区数据的存储空间指针,sector是从第几个扇区开始,nsects表示取几个扇区,

sectorsize为扇区的大小

int read_disk(FileHandle hnd, void *ptr, lloff_t sector, int nsects, int sectorsize)

{

lloff_t offset;

DWORD rd, len;

DWORD low;

LONG high;

BOOL ret;

//得到读取的数据在设备中的偏移字节数;

offset = sector * sectorsize;

low = (DWORD)(offset & 0xFFFFFFFF);

high = (DWORD)((offset >> 32)& 0xFFFFFFFF);

//设置当前设备句柄的读取位置

low = SetFilePointer(hnd, low, &high, FILE_BEGIN);

//要读取的扇区的总长度

len = nsects * sectorsize;

//从设备句柄hnd中读取长度为len的数据到ptr指向的存储空间中;其中rd为读取到的数据的长度

ret = ReadFile(hnd, ptr, len, &rd, NULL);

if(!ret)

return -1;

return rd;

}

时间: 2024-10-11 02:51:11

开源ext2read代码走读之-如何读取MBR分区的内容的相关文章

开源ext2read代码走读之-扩展分区与逻辑分区说明及如何读取扩展分区的分区表(EBR)

一个硬盘可以有很多分区,但MBR分区表只有四项,怎么能突破这个限制呢?答案是扩展引导记录(EBR - Extended Boot Record),通过把MBR分区表中一项设为扩展分区(系统ID为0x05或0x0F),其分区表项指定扩展分区的起始位置和长度,在其中最开始扇区 (EBR)和MBR相同位置(0x1BE)放置另外一个分区表,一般称为扩展分区表.扩展分区表的第一项指定扩展分区目前的逻辑分区信息,如果还有更多的 逻辑分区,扩展分区表的第二项指定下一个EBR的位置,否则为0.最后的两个分区表项

开源ext2read代码走读之-MBR中的一个分区表的构成与分区类型值

根据前面的MBR中包含的4个分区表中的一个分区表的信息,对应的结构体为: struct MBRpartition { unsigned char boot_ind;         /* 0x80 - active */ unsigned char head;             /* starting head */ unsigned char sector;           /* starting sector */ unsigned char cyl;              /

开源ext2read代码走读之--“\\\\.\\PhysicalDrive0”意义?

在ext2read中读取ext4文件系统的代码中,读取硬盘中的信息时,定义了以下的宏,那么这个宏是什么意思呢? #define DEVICE    "\\\\.\\PhysicalDrive0"是什么意思? 由于"\"是C/C+中转义符, "\\\\.\\"就相当于\\.\,那么以上的宏定义中的"\\\.\\PhysicalDrive0"就等价于"\\.\PhysicalDrive0" 在Windows中

开源ext2read代码走读之-在windows下如何判断有几个硬盘设备?

int get_ndisks() { HANDLE hDevice;               // handle to the drive to be examined int ndisks = 0; char path[20] = {"\\\\.\\PhysicalDrive0"}; do { //TRACE("NDISKS %s", path); hDevice = CreateFileA(path, // drive to open GENERIC_REA

阿里巴巴的哪些年开源的代码

服务框架 Dubbo Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件:   Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. RPC: 一...更多Dubbo信息 最近更新: [每日一博]JFinal 中使用 Dubbo -- 3 集群 发布于 1年前 JDBC连接池.监控组件 Druid Druid是一个

Kd-Tree算法原理和开源实现代码

本文介绍一种用于高维空间中的快速最近邻和近似最近邻查找技术——Kd-Tree(Kd树).Kd-Tree,即K-dimensional tree,是一种高维索引树形数据结构,常用于在大规模的高维数据空间进行最近邻查找(Nearest Neighbor)和近似最近邻查找(Approximate Nearest Neighbor),例如图像检索和识别中的高维图像特征向量的K近邻查找与匹配.本文首先介绍Kd-Tree的基本原理,然后对基于BBF的近似查找方法进行介绍,最后给出一些参考文献和开源实现代码.

关于开源中国代码托管的一些问题

之前,我发布一篇解决dropbox被封,导致苹果in-house方式安装问题的一篇博文,因为写文档时间比较仓促,关键地方没有说明白,导致大家看后有些疑惑.主要是在开源中国的那个问题,普遍反映都找不到开源中国新建项目的地方.今早我特意整体又走了一遍,发现确实我上一篇文章写的有问题,在这里给大家致歉了,并在稍后会改正过来.下面就说下开源中国怎么新建项目. 1.百度"代码管理 开源中国"或者直接访问http://git.oschina.net/ 2.有账号的直接登录,没有账号的注册账号. 3

开源Git代码托管平台

开源Git代码托管平台主要参考有以下4个: 1.GitHub 很多开源项目都来自GitHub,但是GitHub只能新建公开的Git仓库,私有 仓库要收费.GitHub地址:https://github.com/. 2.Gitlab 支持无限的公有项目和私有项目.Gitlab地址:https://about.gitlab.com/ 主要功能:项目动态-活动流记录,项目文件-在线预览,项目维基-wiki,代码审查,问题管理-issue,代码片段-code 3.oschina 开源中国代码托管,一个账

【实战代码】PHP实现读取一个1G的文件大小

本文地址:http://www.cnblogs.com/aiweixiao/p/7535351.html 欢迎关注我的微信公众号哈 “ 程序员的文娱情怀” http://t.cn/RotyZtu [背景]:由于 file函数是一次性将所有内容读入内存,而php为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以要想点好办法. [思路]: 01 思路1:利用php执行linux的命令,将一个文件内容(a.log)复制到另一个文件中(b.log) cat a.log