📄 data.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 + -