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

📄 data.c

📁 在efi下读取datahub的一个小程序
💻 C
字号:
#include"shell.h"
#include"datahub\datahub.h"
UINT32    mInstance=0;
EFI_GUID  gEfiDataHubProtocolGuid = EFI_DATA_HUB_PROTOCOL_GUID;
CHAR16 *
ReturnClassString (
  IN  UINT64  RecordClass
  );

EFI_STATUS
DisplayDataHubEntry(
IN EFI_DATA_RECORD_HEADER *Data
);
EFI_STATUS
InitializeDataHub(
IN EFI_HANDLE         ImageHandle,
  IN EFI_SYSTEM_TABLE   *SystemTable
  );
EFI_STATUS
DumpDataHub(
IN EFI_DATA_HUB_PROTOCOL *DataHub,
IN UINT64                 ClassFilter
);

EFI_STATUS
InitializeDataHub(
IN EFI_HANDLE  ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
	EFI_STATUS  Status;
	EFI_DATA_HUB_PROTOCOL *DataHub;
	UINT64               ClassFilter;
	
	InitializeShellApplication(ImageHandle,SystemTable);
	Status=EFI_SUCCESS;
	ClassFilter=0;
	if(SI->Argc>1){
		ClassFilter=(UINT64)xtoi(SI->Argv[1]);
	}
	Status=LibLocateProtocol(&gEfiDataHubProtocolGuid,&DataHub);
	if(EFI_ERROR(Status)){
		Print(L"DataHub:No Data Hub Protocol");
		return EFI_UNSUPPORTED;
	}
	DumpDataHub(DataHub,ClassFilter);
	return EFI_SUCCESS;
}

EFI_STATUS
DumpDataHub(
IN EFI_DATA_HUB_PROTOCOL *DataHub,
IN UINT64   ClassFilter
)
{
	EFI_STATUS  Status;
	UINT64      MonotonicCount;
	EFI_INPUT_KEY  Key;
	EFI_DATA_RECORD_HEADER *Record;
	ST->ConOut->ClearScreen(ST->ConOut);
	Print(L"\nDumping Data Hub");
	MonotonicCount=0;
	do{
		Status=DataHub->GetNextRecord(DataHub,&MonotonicCount,NULL,&Record);
		if(EFI_ERROR(Status)){
			continue;}
if(ClassFilter!=Record->DataRecordClass&&ClassFilter!=0){
	continue;
}
Status=DisplayDataHubEntry(Record);
if(Status==0x1000)
		{return EFI_SUCCESS;
		}
WaitForSingleEvent(ST->ConIn->WaitForKey,0);
ST->ConIn->ReadKeyStroke(ST->ConIn,&Key);
if(Key.ScanCode==0x17)
	break;
	}while(MonotonicCount!=0);
}

EFI_STATUS
DisplayDataHubEntry(
 IN  EFI_DATA_RECORD_HEADER *Data
  )
{

  UINTN                              Size;
  CHAR8                             *RawFormat;
  //SHELL_FILE_ARG                       *Arg;
 // LIST_ENTRY                           FileList;
  ///UINT8                                *Buffer2;
//  EFI_FILE_HANDLE                       NewDir;	
//  EFI_STATUS                             Status;
  EFI_INPUT_KEY Key;   
  //NewDir=NULL;
/*  InitializeListHead(&FileList);

  Status=ShellFileMetaArg (SI->Argv[1],&FileList);
  if(EFI_ERROR(Status))
  	{
  	Print(L"Cannot create file -%r\n",Status);
  	return Status;
	}
  Arg = CR(FileList.Flink, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);
 if ( Arg == NULL ) {
	 Print(L"Disk Error\n");
	  return Status;
 }

 if(Arg->Parent==NULL)
    {
	  Print(L"Disk Error\n");
	  return Status;
	  }
  Status = Arg->Parent->Open (
                      Arg->Parent,
                      &Arg->Handle,
                      Arg->FileName,
                    //  SI->Argv[i+1],
                      EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
                      0
                     );//建立文件成功            
*/
  Print(L"\nDump EFI_DATA_RECORD_HEADER");
  
   Print(L"\nMTC (%lX) %t %s\n HeaderSize = %d\nDataRecordSize=%d\n Record Guid (%g)\n ProducerName (%g)\n",
	   Data->LogMonotonicCount,
	   &Data->LogTime,
	   ReturnClassString(Data->DataRecordClass),
	   Data->HeaderSize,
       Data->RecordSize,
	   &Data->DataRecordGuid,
       &Data->ProducerName
	  ); 
   DumpHex(2,0,Data->HeaderSize,Data);
   Print(L"\nPress ESC exit\n");
   WaitForSingleEvent(ST->ConIn->WaitForKey,0);
   ST->ConIn->ReadKeyStroke(ST->ConIn,&Key);
   if(Key.ScanCode==0x17)
	  return 0x1000;
   Print(L"\n");
  Print(L"Dump SUBCLASS DATA\n");
  Size=Data->RecordSize;
  RawFormat=((UINT8 *)Data)+Data->HeaderSize;
  DumpHex(2,0,Size,RawFormat);
 /* Status=Arg->Handle->Write(Arg->Handle,&Size,RawFormat);
	 if(EFI_ERROR(Status))
	 {
	   Print(L"Write error\n");
		  return Status;
	 } 
  Print(L"Press ESC exit\n");
  }
  */
}
  
CHAR16 *
ReturnClassString (
  IN  UINT64  RecordClass
  )
{
  switch (RecordClass) {
  case EFI_DATA_RECORD_CLASS_DEBUG:
    return L"debug";
  case EFI_DATA_RECORD_CLASS_ERROR:
    return L"error";
  case EFI_DATA_RECORD_CLASS_DATA:
    return L"data";
  case EFI_DATA_RECORD_CLASS_PROGRESS_CODE:
    return L"progress code";
  default:
    return L"unknown";
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -