前段时间在安装黑苹果时,发现一个问题,电脑在启动时,会找激活分区,如果没有找到,那就启动不起来。

那能否写个小程序读取一下MBR信息,把激活分区换成其它,搞点恶作剧呢,于是就有了这篇读取MBR信息的文章,但是没写入,不敢尝试。

通过动手学习,对硬盘MBR信息有了更好的了解。

1、我的硬盘主引导记录信息及分析

80 01 01 00 07 FE FF FF 3F 00 00 00 0D F0 BF 03(主分区)
偏移00H---80---激活标志---表示可引导
偏移01H---01---表示分区开始的磁头号为1
偏移02H---01---转换为二进制后为8位,0-5位表示该分区的起始扇区号---此处为1
偏移03H---00---02H的6-7位与03H的全部8位,共10位,组成起始磁柱号---此处为0
偏移04H---07---表示文件系统类型NTFS。
偏移05H---FE---转换为十进制254,表示分区结束的磁头号为254
偏移06H---FF---转换为二进制1111 1111,0-5位即3F,十进制下的63---该分区的结束扇区号为63。
偏移07H---FF---与06H的6-7位10合起来为3FF,即十进制下的1023---该分区的结束磁柱号为1023。
偏移08H、09H、0AH,0BH---3F 00 00 00---为分区起始相对扇区号63
偏移0CH、0DH、0EH,0FH---0D F0 BF 03---为分区总的扇区数3BFF00D,转换为十进制为62910477。
00 FE FF FF 05 FE FF FF 4C F0 BF 03 75 E6 82 21(扩展分区)
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00(没有使用)
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00(没有使用)
55 AA(MBR的结束标志位)
从上面可以看出MBR开分区结构最多只能识别4个主要分区,但是为什么我们的电脑上可以分4个以上的盘呢?
这是因为一般电脑上是一个主分区,一个扩展分区,在扩展分区中又分的逻辑分区(扩展分区中可以有多个逻辑分区)

2、获取相关信息的代码(Win7下,请以管理员身份运行)

//基于http://www.cnblogs.com/onepc/archive/2011/12/01/2270468.html来修改的。
//在此感谢此博友
//2012.10.10
#include <iostream>
#include <windows.h>
using namespace std;#pragma pack(1) //字节对齐
typedef struct _PARTITION_ENTRY//分区表结构
{UCHAR active; //状态(是否被激活)   重要UCHAR StartHead; //分区起始磁头号   USHORT StartSecCyli; //与63相位与得出的是开始扇区,把它右移6位就是开始柱面UCHAR PartitionType; // 分区类型   重要 UCHAR EndHead; //分区结束磁头号USHORT EndSecCyli; //与63相位与得出的就是结束扇区,把它右移6位就是结束柱面ULONG StartLBA; // 扇区起始逻辑地址(相对扇区号)   重要ULONG TotalSector; // 分区大小      重要
} PARTITION_ENTRY, *PPARTITION_ENTRY;//引导区512BYTE结构
typedef struct _MBR_SECTOR
{UCHAR BootCode[440];//启动记录440 ByteULONG DiskSignature;//磁盘签名USHORT NoneDisk;//二个字节PARTITION_ENTRY Partition[4];//分区表结构64 ByteUSHORT Signature;//结束标志2 Byte 55 AA
} MBR_SECTOR, *PMBR_SECTOR;#pragma pack()int main()
{TCHAR szDevicename[64]={0};MBR_SECTOR _ReadMbr;wsprintf(szDevicename,L"\\\\.\\PHYSICALDRIVE0");HANDLE hDevice=CreateFile(szDevicename,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if(hDevice==INVALID_HANDLE_VALUE){cout<<"打开设备出错"<<endl;return -1;}memset(&_ReadMbr,0,sizeof(MBR_SECTOR));DWORD leng=512;DWORD count;DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&count,NULL);UCHAR sz[512]={0};//ReadFile(hDevice,sz,512,&leng,NULL);BOOL bcheck=ReadFile(hDevice,&_ReadMbr,512,&leng,NULL);memcpy(sz,&_ReadMbr,512);for(int i=0;i<66;i++){printf("%02X ",sz[446+i]);if((i+1)%16==0)printf("\n");}printf("\n");if(bcheck==FALSE && leng<512){cout<<"读取MBR出错!"<<endl;DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&count,NULL);CloseHandle(hDevice);return -1;}char *szTemp=new char[64];for(int i=0;i<4;i++){if(_ReadMbr.Partition[i].PartitionType==0){continue;}memset(szTemp,0,64);if(_ReadMbr.Partition[i].active==128){cout<<"激活分区"<<endl;}elsecout<<"非激活分区"<<endl;memset(szTemp,0,64);sprintf(szTemp,"激活分区标志位:%02X",_ReadMbr.Partition[i].active);cout<<szTemp<<endl;memset(szTemp,0,64);sprintf(szTemp,"分区起始磁头号:%d",_ReadMbr.Partition[i].StartHead);cout<<szTemp<<endl;memset(szTemp,0,64);int temp = _ReadMbr.Partition[i].StartSecCyli;sprintf(szTemp,"分区起始扇区号:%d",temp & 63);//63转为二进制111111,做&运算,只取低6位cout<<szTemp<<endl;memset(szTemp,0,64);sprintf(szTemp,"分区起始磁柱号:%d",temp>>6);//取高10位cout<<szTemp<<endl;memset(szTemp,0,64);sprintf(szTemp,"分区文件类型标识:%02d",_ReadMbr.Partition[i].PartitionType);cout<<szTemp<<endl;memset(szTemp,0,64);sprintf(szTemp,"分区结束磁头号:%d",_ReadMbr.Partition[i].EndHead);cout<<szTemp<<endl;memset(szTemp,0,64);temp = _ReadMbr.Partition[i].EndSecCyli;sprintf(szTemp,"分区结束扇区号:%d",temp & 63);cout<<szTemp<<endl;memset(szTemp,0,64);sprintf(szTemp,"分区结束磁柱号:%d",temp>>6);cout<<szTemp<<endl;memset(szTemp,0,64);sprintf(szTemp,"分区起始相对扇区号:%d",_ReadMbr.Partition[i].StartLBA);cout<<szTemp<<endl;memset(szTemp,0,64);sprintf(szTemp,"分区总的扇区数:%d",_ReadMbr.Partition[i].TotalSector);cout<<szTemp<<endl;}DeviceIoControl(hDevice, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &count, NULL);CloseHandle(hDevice);system("pause");return 0;
}

												

主引导记录(MBR)信息分析与获取相关推荐

  1. 主引导记录(MBR)的反汇编分析

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; 主引导记录(MBR)的反汇编分析 ; ;;;;;;; ...

  2. 重装系统时启动失败,引导信息有错误,修复磁盘的主引导记录MBR方法

    如果要修复这个磁盘的主引导记录MBR,必须在PE下才能进行,下面以通用PE工具箱来制作PE启动U盘. 先从网上把这个工具下载下来,安装到电脑上,先打开安装包,启动后,点"安装"即可 ...

  3. 主引导扇区及主引导记录MBR的详细说明

    引导扇区在每个分区里都存在,但是我们常说的*主引导扇区*是硬盘的 第一物理扇区.它由两个部分组成:即主引导记录MBR和硬盘分区表DPT.在 总共512字节的主引导分区里其中MBR占446个字节(偏移0 ...

  4. 硬盘主引导记录(MBR)及其结构详解

    硬盘的0柱面.0磁头.1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR).该记录占用512个字节,它用于硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统 ...

  5. 硬盘结构,主引导记录MBR,硬盘分区表DPT,主分区、扩展分区和逻辑分区,电脑启动过程...

    filex的文件系统看的云里雾里,还是先总结下FAT的一些基本知识吧. 硬盘结构 硬盘有很多盘片组成,每个盘片的每个面都有一个读写磁头.如果有N个盘片.就有2N个面,对应2N个磁头(Heads),从0 ...

  6. 硬盘主引导记录MBR

    主引导记录:(MBR,Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码.它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别.分区引导信息的定位,它由磁盘操作系 ...

  7. 主引导记录MBR/硬盘分区表DPT/主分区、扩展分区和逻辑分区/电脑启动过程

    主引导扇区 主引导扇区位于整个硬盘的0柱面0磁头1扇区{(柱面,磁头,扇区)|(0,0,1)},bios在执行自己固有的程序以后就会jump到MBR中的第一 条指令.将系统的控制权交由mbr来执行.主 ...

  8. 硬盘结构,主引导记录MBR,硬盘分区表DPT,主分区、扩展分区和逻辑分区

    filex的文件系统看的云里雾里,还是先总结下FAT的一些基本知识吧. 硬盘结构 硬盘有很多盘片组成,每个盘片的每个面都有一个读写磁头.如果有N个盘片.就有2N个面,对应2N个磁头(Heads),从0 ...

  9. 硬盘主引导记录(MBR)及其结构

    硬盘的0柱面.0磁头.1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR).该记录占用512个字节,它用语硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统 ...

最新文章

  1. HDU 5834 Magic boy Bi Luo with his excited tree
  2. 在ASP.Net中使用FCKeditor
  3. perl anyevent socket监控web日志client
  4. C++实现线段树RMQ-单点修改,区间查询
  5. 【渝粤题库】陕西师范大学180208 产品管理 作业(专升本)
  6. VSCode.exe扩展主机意外终止。请重新加载窗口以恢复。
  7. 游戏服务器架构:网络服务器端程序线程划分
  8. dos 注册服务器,DOS命令实现服务器断线短信通知
  9. 网络(13)-SYN flood及其应对方法
  10. QT Creator 使用 design 修改 ui界面编译后界面未更新代码提示
  11. X3950通过MGMT关机产生NMI,PCI,LOG报错
  12. 【Java程序设计】图形用户界面(一)
  13. 如何将所有音乐从 iPhone传输到Mac?
  14. Go语言:交换两个整型变量的值
  15. Java数据库连接详解
  16. 安装11.2.0.3时,OUI的log报错:OUI-10066:Not All The Dependencies For The Component ... Could Be Found
  17. 基于学生信息管理系统的数据库系统课程设计升级版(mysql)
  18. 深入浅出 - Android系统移植与平台开发(四)- Android启动流程
  19. Android:如何优雅的开发马甲包?
  20. 计算机的管理软件有哪些,电脑里有很多文件,很乱但是都有用,有什么管理软件值得推荐?...

热门文章

  1. Matlab和stk通过connector连接,win7下亲测好用
  2. 怎样自己开发一个wordpress插件?
  3. cruise软件模型,混动仿真模型,IMMD架构混联混动仿真模型,Cruise混动仿真模型
  4. python调用usb摄像头_Python通过cv2读取多个USB摄像头
  5. 谜题51:那个点是什么?
  6. 测试员与程序员如何相处
  7. .NetCore WPF应用Nlog日志模块
  8. fastadmin的详细安装过程
  9. 微信小程序:打开设置(权限)页面
  10. flag 60牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,