磁盘引导扇区与磁盘分区表
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 { //没有找到需要的分区,进行对应的处理 }