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分区表
详细的可以参考: 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
;