磁盘引导扇区与磁盘分区表

 1 /*常 数 宏 定 义*/
 2 #define DPT_START_ADDRESS      0x01BE
 3 
 4 /*动 作 宏 定 义*/
 5 #define DPT_PARTITION_START_SECTOR(__DPT_ITEM_ADDR)    \
 6             (__DPT_ITEM_ADDR)->RelativeSectors
 7 
 8 /*用户变量类型定义*/
 9 typedef struct DiskPartitionTableItem DPT_ITEM;
10 
11 /*结构体定义区*/
12 struct DiskPartitionTableItem
13 {
14  BYTE        ActivePartition;
15  BYTE        StartHead;
16  unsigned    StartSector     :6;
17  unsigned    StartCylinder   :10;
18  BYTE        OSIndicator;
19  BYTE        EndHead;
20  unsigned    EndSector       :6;
21  unsigned    EndCylinder     :10;
22  UINT32      RelativeSectors;
23  UINT32      TotalSectors;
24 };

>>如何依次获取各个磁盘分区的信息

 

  • /***********************************************************
  • *   函数说明:  获取下一个DPT项                                      *
  • *   输入:      主引导扇区指针,分区表项指针                       *
  • *   输出:      下一个分区表项                                           *
  • *   调用函数:  无                                                          *
  • * -------------------------------------------------------- *
  • *   [使用说明]                                                                *
  • *           当传入的分区表项指针为空(NULL)时,自动返回第   *
  • *       一个分区表项。当传入的分区表项指针不为空时,自动返   *
  • *       回下一个分区表项的指针,当下一个分区表项不存在时,   *
  • *       返回空(NULL)                                                    *
  • ***********************************************************/

 

DPT_ITEM *Get_Next_Disk_Partition(
    BYTE *pchMasterBootSector,
    DPT_ITEM *pdptPartition
)
{
    if (pchMasterBootSector == NULL)
    {
         /* 无效的输入 */
        return NULL;
    }    

    if (pdptPartition == NULL)
    {
         /* 要求返回第一个分区表项 */
        pdptPartition = (DPT_ITEM *)(pchMasterBootSector 
                              +  DPT_START_ADDRESS);
    }
    else
    {
         /* 指向下一个分区表项 */
        pdptPartition += 1;
    }

     /* 进行分区表项的有效性检测 */
    {
        UINT8 n = 0;
        BOOL bIfValid = FALSE;
        for (n = 0;n < sizeof(DPT_ITEM);n++)
        {
           if (((BYTE *)pdptPartition)[n] != 0x00)
           {
               bIfValid = TRUE;
               break;
           }
        }

        if (!bIfValid)
        {
              /* 表项为空 */
              return NULL;
         }
     }

     return pdptPartition;
}

 

使用范例

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  • //从引导扇区中提取第一个磁盘分区在物理扇区中的偏移量
  • //其中g_chSectorBuffer是一个大小为512字节的数组,保存
  • //了磁盘第一个引导扇区的内容
  • s_dwPartitionSectorOffset = DPT_PARTITION_START_SECTOR( Get_Next_Disk_Partition(g_chSectorBuffer,NULL));
  • //从引导扇区中查找第一个类型为NTFS的磁盘分区,并返回
  • //它在物理扇区偏移量

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define OS_INDICATOR_NTFS                0x07
DPT_ITEM *pDPTItem = NULL;
do
{
    //读取新的分区信息
    pDPTItem = Get_Next_Disk_Partition(g_chSectorBuffer,pDPTItem);
 
   if ((pDPTItem != NULL) && 
        (pDPTItem->OSIndicator ==  OS_INDICATOR_NTFS))
   {
         s_dwPartitionSectorOffset =  
         DPT_PARTITION_START_SECTOR (pDPTItem);
         break;
   }
}

while(pDPTItem != NULL)

if (pDPTItem != NULL)
{
    //找到了需要的分区,进行对应的处理
}
else
{
    //没有找到需要的分区,进行对应的处理
}