📄 disktool.c
字号:
if(IsPartID)//查找第一个分区的blk
{
if (MetaiMatch(DevicePathAsString, L"*Ata(Primary,Master)*HD(Part1*"))
{
return BLKID;
}
else if (MetaiMatch(DevicePathAsString, L"*Ata(Primary,Slave)*HD(Part1*"))
{
return BLKID;
}
else if (MetaiMatch(DevicePathAsString, L"*Ata(Secondary,Master)*HD(Part1*"))
{
return BLKID;
}
else if (MetaiMatch(DevicePathAsString, L"*Ata(Secondary,Slave)*HD(Part1*"))
{
return BLKID;
}
}
else//查找硬盘的主blk
{
if (MetaiMatch(DevicePathAsString, L"*Ata(Primary,Master)*"))
{
if(MetaiMatch(DevicePathAsString, L"*HD(Part*"))//是一个硬盘分区
{
m_AtaIDEDevice.PrimaryMaster[0]=ATAIDE_HARDDISK;
}
else if(MetaiMatch(DevicePathAsString, L"*CDROM*"))//是一个光驱分区
{
m_AtaIDEDevice.PrimaryMaster[0]=ATAIDE_CDROM;
}
else//是一个块主设备,我们并不知道它到底是什么,但不用关心
{
m_AtaIDEDevice.PrimaryMaster[1]=BLKID;//记下它的blk号
}
}
else if (MetaiMatch(DevicePathAsString, L"*Ata(Primary,Slave)*"))
{
if(MetaiMatch(DevicePathAsString, L"*HD(Part*"))//是一个硬盘分区
{
m_AtaIDEDevice.PrimarySlave[0]=ATAIDE_HARDDISK;
}
else if(MetaiMatch(DevicePathAsString, L"*CDROM*"))//是一个光驱分区
{
m_AtaIDEDevice.PrimarySlave[0]=ATAIDE_CDROM;
}
else//是一个块主设备,我们并不知道它到底是什么,但不用关心
{
m_AtaIDEDevice.PrimarySlave[1]=BLKID;//记下它的blk号
}
}
else if (MetaiMatch(DevicePathAsString, L"*Ata(Secondary,Master)*"))
{
if(MetaiMatch(DevicePathAsString, L"*HD(Part*"))//是一个硬盘分区
{
m_AtaIDEDevice.SecondaryMaster[0]=ATAIDE_HARDDISK;
}
else if(MetaiMatch(DevicePathAsString, L"*CDROM*"))//是一个光驱分区
{
m_AtaIDEDevice.SecondaryMaster[0]=ATAIDE_CDROM;
}
else//是一个块主设备,我们并不知道它到底是什么,但不用关心
{
m_AtaIDEDevice.SecondaryMaster[1]=BLKID;//记下它的blk号
}
}
else if (MetaiMatch(DevicePathAsString, L"*Ata(Secondary,Slave)*"))
{
if(MetaiMatch(DevicePathAsString, L"*HD(Part*"))//是一个硬盘分区
{
m_AtaIDEDevice.SecondarySlave[0]=ATAIDE_HARDDISK;
}
else if(MetaiMatch(DevicePathAsString, L"*CDROM*"))//是一个光驱分区
{
m_AtaIDEDevice.SecondarySlave[0]=ATAIDE_CDROM;
}
else//是一个块主设备,我们并不知道它到底是什么,但不用关心
{
m_AtaIDEDevice.SecondarySlave[1]=BLKID;//记下它的blk号
}
}
}
}
}
}while (!EFI_ERROR(Status));
//然后我们搜索刚才建立的IDE表,找到第一个硬盘
if(m_AtaIDEDevice.PrimaryMaster[0]==ATAIDE_HARDDISK)
return m_AtaIDEDevice.PrimaryMaster[1];
if(m_AtaIDEDevice.PrimarySlave[0]==ATAIDE_HARDDISK)
return m_AtaIDEDevice.PrimarySlave[1];
if(m_AtaIDEDevice.SecondaryMaster[0]==ATAIDE_HARDDISK)
return m_AtaIDEDevice.SecondaryMaster[1];
if(m_AtaIDEDevice.SecondarySlave[0]==ATAIDE_HARDDISK)
return m_AtaIDEDevice.SecondarySlave[1];
return -1;//没有IDE 块设备
}
//block字符串变成ID号,如果BlkStr不是合法的blk字符串返回-1
//合法的blk字符串:blk0 blk1 blk2......
INT32 BlkStrToBlkID(CHAR16* BlkStr)
{ INT32 Len,i;
CHAR16 ID[10];
if(BlkStr==NULL)return -1;
Len = StrLen(BlkStr);
if(Len<4)return -1;
if(BlkStr[0]!='b')return -1;
if(BlkStr[1]!='l')return -1;
if(BlkStr[2]!='k')return -1;
for(i=3;i<Len;i++)
{
ID[i-3]=BlkStr[i];
}
ID[i-3]=0;
i= Atoi(ID);
return i;
}
//fs字符串变成ID号,如果fsStr不是合法的fs字符串返回-1
//合法的fs字符串:fs0 fs1 fs2......
INT32 FSStrToFSID(CHAR16* FSStr)
{
INT32 Len,i;
CHAR16 ID[10];
if(FSStr==NULL)return -1;
Len = StrLen(FSStr);
if(Len<4)return -1;
if(FSStr[0]!='f')return -1;
if(FSStr[1]!='s')return -1;
for(i=3;i<Len;i++)
{
ID[i-3]=FSStr[i];
}
ID[i-3]=0;
i= Atoi(ID);
return i;
}
//////////////////////////////////////////////////////////
//获得第一个IDE硬盘的文件系统号,没有返回-1
//优先级如下:
// Primary,Master
// Primary,Slave
// Secondary,Master
// Secondary,Slave
///////////////////////////////////////////////////////////
INT32 GetFirstIDEHardDiskFSID()
{
return GetIDEHardDiskFSID(1);
}
//////////////////////////////////////////////////////////
//获得第n (n>=1)个IDE硬盘分区的文件系统号没有返回-1
//优先级如下:
// Primary,Master
// Primary,Slave
// Secondary,Master
// Secondary,Slave
///////////////////////////////////////////////////////////
INT32 GetIDEHardDiskFSID(INT32 DiskPartitionIndex)
{
EFI_STATUS Status;
EFI_HANDLE *HandleBuffer;
EFI_FILE_IO_INTERFACE *Vol;
UINTN i,NoHandles;
CHAR16 MapName[MAX_FILEPATH_LENGTH];
CHAR16 LabelName[MAX_FILEPATH_LENGTH];
EFI_FILE_HANDLE RootFs;
EFI_DEVICE_PATH *DevicePath;
CHAR16 *DevicePathAsString;
CHAR16 HardDiskPartition[30];
NoHandles = 0;
HandleBuffer = NULL;
Status = LibLocateHandle(ByProtocol,
&FileSystemProtocol,
NULL,
&NoHandles,
&HandleBuffer
);
if (EFI_ERROR(Status))
{
Print(L"Can not get the array of FileSystemProtocol handles\n");
return -1;
}
StrCpy(HardDiskPartition,L"");
SPrint(HardDiskPartition, 30, L"*HD(Part%d*", DiskPartitionIndex);
for(i=0;i<NoHandles;i++)
{
ZeroMem(MapName, sizeof(CHAR16)*MAX_FILEPATH_LENGTH);
ZeroMem(LabelName, sizeof(CHAR16)*MAX_FILEPATH_LENGTH);
Status = GetMapName(HandleBuffer[i], MapName,LabelName, MAX_FILEPATH_LENGTH);
if (!EFI_ERROR(Status))
{
Status = BS->HandleProtocol (HandleBuffer[i],
&FileSystemProtocol,
(VOID*)&Vol);
if (!EFI_ERROR(Status))
{
Status = Vol->OpenVolume (Vol, &RootFs);
}
}
/////////////////////////////////////////////////////
Status = BS->HandleProtocol (HandleBuffer[i],
&DevicePathProtocol,
(VOID*)&DevicePath);
if (EFI_ERROR(Status) || DevicePath==NULL)
{
Print(L"Can not get a DevicePath handle for HandleBuffer\n");
return EFI_NO_MAPPING;
}
DevicePathAsString=DevicePathToStr(DevicePath);
if(MetaiMatch(DevicePathAsString, HardDiskPartition))
{
if (MetaiMatch(DevicePathAsString, L"*Ata(Primary,Master)*"))
{
//Print(L"i=%d,Label=%s\n",i,LabelName);
i=FSStrToFSID(LabelName);
break;
}
else if (MetaiMatch(DevicePathAsString, L"*Ata(Primary,Slave)*"))
{
//Print(L"i=%d,Label=%s\n",i,LabelName);
i=FSStrToFSID(LabelName);
break;
}
else if (MetaiMatch(DevicePathAsString, L"*Ata(Secondary,Master)*"))
{
//Print(L"i=%d,Label=%s\n",i,LabelName);
i=FSStrToFSID(LabelName);
break;
}
else if (MetaiMatch(DevicePathAsString, L"*Ata(Secondary,Slave)*"))
{
//Print(L"i=%d,Label=%s\n",i,LabelName);
i=FSStrToFSID(LabelName);
break;
}
}
}
if (NoHandles>0)
FreePool(HandleBuffer);
if(i>=NoHandles)return -1;
else return i;
}
//获取分区列表,存放每个分区的偏移量(扇区)
void GetDiskPartitionTable(DiskPartitionTable *DPT)
{
UINT8 *Buffer = NULL;
UINT8 *MBRBuffer = NULL;
INT32 i;
UINT32 BaseOffset,CurPartionOffset;
BS->AllocatePool(EfiLoaderData,512, &Buffer);//开辟512缓冲区
if (Buffer == NULL) {
Print(L"Can not allocate a buffer\n");
BS->Exit(g_ImageHandle,EFI_SUCCESS,0,NULL);
}
BS->AllocatePool(EfiLoaderData,512, &MBRBuffer);//开辟512缓冲区
if (MBRBuffer == NULL) {
Print(L"Can not allocate a buffer\n");
BS->Exit(g_ImageHandle,EFI_SUCCESS,0,NULL);
}
////////////////////////////////////////////////
DPT->DiskPartitionNum=0;//初始化分区列表
DPT->ExtendPartitionNum=0;
DiskBlockIO_ReadBlock(MBRBuffer, 0,1);//读取MBR
//循环处理4个分区条目
//偏移从第一个DPT的系统标志开始
for(i=0;i<4;i++)
{
if(MBRBuffer[i*0x10+0x1c2]!=0)//如果这条有分区
{
if((MBRBuffer[i*0x10+0x1c2]==0x05)||(MBRBuffer[i*0x10+0x1c2]==0x0f))//扩展分区
{
//记录扩展分区的基分区地址
BaseOffset = HextoDec(
MBRBuffer[i*0x10+0x1c9],
MBRBuffer[i*0x10+0x1c8],
MBRBuffer[i*0x10+0x1c7],
MBRBuffer[i*0x10+0x1c6]);
CurPartionOffset = BaseOffset;
while(1)//循环到扩展分区链表被完整读出
{
//读出这个扇区
DiskBlockIO_ReadBlock(Buffer, CurPartionOffset,1);
if(Buffer[0x1c2]!=0)//如果第一个DPT 不为空
{
//记录这个磁盘分区的位置
DPT->m_DiskPartition[DPT->DiskPartitionNum].Offset=CurPartionOffset;
DPT->m_DiskPartition[DPT->DiskPartitionNum].Size = HextoDec(Buffer[0x1cd],Buffer[0x1cc],Buffer[0x1cb],Buffer[0x1ca]);
DPT->m_DiskPartition[DPT->DiskPartitionNum].PartitionLevel = PARTITION_EXTEND;//扩展分区
DPT->DiskPartitionNum++;//增加一个磁盘分区
DPT->ExtendPartitionNum++;
}
else break;
if((Buffer[0x1d2]==0x05)||(Buffer[0x1d2]==0x0f))//有下一个磁盘
{
CurPartionOffset =BaseOffset + HextoDec(
Buffer[0x1d9],
Buffer[0x1d8],
Buffer[0x1d7],
Buffer[0x1d6]);
}
else break;
}
}
else//普通主分区
{
//保存它的位置
DPT->m_DiskPartition[DPT->DiskPartitionNum].Offset=HextoDec(
MBRBuffer[i*0x10+0x1c9],
MBRBuffer[i*0x10+0x1c8],
MBRBuffer[i*0x10+0x1c7],
MBRBuffer[i*0x10+0x1c6]);
DPT->m_DiskPartition[DPT->DiskPartitionNum].PartitionLevel = PARTITION_PRIMARY;//主分区
DPT->DiskPartitionNum++;//增加一个磁盘分区
}
}
}
/////////////////////////////////////////////
FreePool(Buffer);
FreePool(MBRBuffer);
}
//打印分区列表
void PrintDiskPartitionTable(DiskPartitionTable *DPT)
{
UINT32 i;
Print(L"=Disk Partition Table=====\r\n");
Print(L"ID Type Offset Size\r\n");
for(i=0;i<DPT->DiskPartitionNum;i++)
{
Print(L"%d:",i);
if(DPT->m_DiskPartition[i].PartitionLevel==PARTITION_PRIMARY)
{
Print(L" Primary ");
}
else Print(L" Extend ");
Print(L"%d %d\n",
DPT->m_DiskPartition[i].Offset,
DPT->m_DiskPartition[i].Size
);
}
Print(L"Size of DPT : %d\n",sizeof(DiskPartitionTable));//320 BYTEs
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -