关于在windows os 下 MBR/GPT 分区的实现 (一)

MBR(Master Boot Record),  主引导记录,也叫引导区。位于整个硬盘的0柱面0磁头0扇区。主要有五部分组成:引导程序、windows 磁盘签名、保留位、分区表、结束标志。整个大小为512Bytes.参考下图:

详细的可以参考: http://zh.wikipedia.org/wiki/主引导记录
这里主要讨论,磁盘分区表(DPT):Disk Partition Table, 他在磁盘的第一个扇区的偏移offset = 446 位置开始的连续64个bytes, 他在MBR中是一个非常关键的数据结构。分区表示用来管理硬盘分区的,如果丢失或破坏的话,硬盘的分区就会丢失。

分区表占用了64个字节,每16个字节来描述一个分区项的数据结构。由于其字节限制,一个硬盘最多可以有4个主硬盘分区。
再来看下每一个分区项的16个字节代表的数据结构:

对于上述数据的分析
80:激活标志,表示系统可引导
01 01 00:分区开始磁头为01, 开始扇区为01,开始柱面为0
07:表示这个分区是 NTFS文件系统,还有常用的 0x0b(FAT32), 0X04(FAT16)
FE FF FF: 分区结束的磁头,扇区,柱面,但是,如果磁盘容量超过8G, 用chs( Cylinder/Head/Sector )已经不能表示了,故设置成 FE FF FF
3F 00 00 00 (小端);表示分区的首扇区相对便宜量为 63 sector, 
93 41 E2 09(小端) : 这个分区的总扇区号,0x09E24193 sector = 79.09 GB
刚好是我C盘的容量:


下面看在 windows 下怎样通过代码控制来写 MBR/GPT 的分区表:
千万不要试着将PhysicalNum 设置为 0, \\.\ PHYSICALDRIVE0, 这个代表系统的磁盘,这样格式化后系统就奔溃了。。。。
我们一般要外接一块硬盘,这样物理盘就是  \\.\ PHYSICALDRIVE1
步骤: 1. 得到磁盘的总容量 
            2. 初始化磁盘,分区(MBR和GPT两种分区表)
            3  格式化
 下面看一下代码的实现:
当磁盘容量大于 2T 时,我用的是GPT分区表,小于2T时用的是MBR分区表
bool  CreatePartition ( int  PhysicalDriveNumber )
{
     // TODO: Add your control notification handler code here
     BOOL  br  =  FALSE ;
     HANDLE  hDev  =  NULL ;
     CString  strDev ;
     DWORD  returnedCount  =  0 ;
     strDev . Format ( _T ( "\\\\.\\PHYSICALDRIVE%d" ) ,  PhysicalDriveNumber ) ;
     if  ( ! strDev . IsEmpty ( ))
     {
         hDev  =  :: CreateFile ( strDev ,  GENERIC_WRITE |  GENERIC_READ ,  0 ,  NULL ,  OPEN_EXISTING ,  0 ,  NULL ) ;
         if  ( hDev  !=  INVALID_HANDLE_VALUE )
         {
              DISK_GEOMETRY_EX *  pDgEx  =  ( DISK_GEOMETRY_EX * )  new  BYTE [ 512 ] ;
              //Get disk size
              if  ( :: DeviceIoControl ( hDev , 
                   IOCTL_DISK_GET_DRIVE_GEOMETRY_EX , 
                   NULL , 
                   0 ,
                   pDgEx , 
                   512 , 
                   & returnedCount , 
                   NULL ))
              {
                   //MessageBox(_T("GET_DRIVE_GEOMETRY_EX"));
                   CREATE_DISK  cd ;
                   CREATE_DISK *  pCd  =  & cd ;
                   PDISK_PARTITION_INFO  pDpi  =  ( PDISK_PARTITION_INFO )  pDgEx -> Data ;    //DiskGeometryGetPartition(pDgEx);
                 
                  LARGE_INTEGER  totalSizeOfDisk ;
                  bool  bMBR ;
                   totalSizeOfDisk . QuadPart  =  pDgEx -> Geometry . Cylinders . QuadPart\
                       *  pDgEx -> Geometry . TracksPerCylinder\
                        *  pDgEx -> Geometry . SectorsPerTrack\
                        *  pDgEx -> Geometry . BytesPerSector ;
                 
                  if  ( totalSizeOfDisk . QuadPart  <=  2147483648 )   // disk size <= 2T MBR
                  {
                       bMBR  =  true ;
                       pCd -> PartitionStyle  =  PARTITION_STYLE_MBR ;
              
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值