⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disktool.c

📁 EFI(Extensible Firmware Interface)是下一代BIOS
💻 C
📖 第 1 页 / 共 3 页
字号:
    		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 + -