aboutsummaryrefslogtreecommitdiffstats
path: root/Lesson_28/UefiLessonsPkg/AcpiInfo/AcpiInfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'Lesson_28/UefiLessonsPkg/AcpiInfo/AcpiInfo.c')
-rw-r--r--Lesson_28/UefiLessonsPkg/AcpiInfo/AcpiInfo.c47
1 files changed, 42 insertions, 5 deletions
diff --git a/Lesson_28/UefiLessonsPkg/AcpiInfo/AcpiInfo.c b/Lesson_28/UefiLessonsPkg/AcpiInfo/AcpiInfo.c
index 88c78b6..0511f59 100644
--- a/Lesson_28/UefiLessonsPkg/AcpiInfo/AcpiInfo.c
+++ b/Lesson_28/UefiLessonsPkg/AcpiInfo/AcpiInfo.c
@@ -2,6 +2,7 @@
#include <Library/UefiLib.h>
#include <Library/BaseMemoryLib.h>
+#include <Protocol/Shell.h>
EFI_STATUS
EFIAPI
@@ -10,6 +11,18 @@ UefiMain (
IN EFI_SYSTEM_TABLE *SystemTable
)
{
+ EFI_SHELL_PROTOCOL* ShellProtocol;
+ EFI_STATUS Status = gBS->LocateProtocol(
+ &gEfiShellProtocolGuid,
+ NULL,
+ (VOID **)&ShellProtocol
+ );
+
+ if (EFI_ERROR(Status)) {
+ Print(L"Can't open EFI_SHELL_PROTOCOL: %r\n", Status);
+ return EFI_SUCCESS;
+ }
+
EFI_ACPI_6_3_ROOT_SYSTEM_DESCRIPTION_POINTER* RSDP = NULL;
for (UINTN i=0; i<SystemTable->NumberOfTableEntries; i++) {
@@ -55,13 +68,37 @@ UefiMain (
while (offset < XSDT->Length) {
UINT64* table_address = (UINT64*)((UINT8*)XSDT + offset);
EFI_ACPI_6_3_COMMON_HEADER* table = (EFI_ACPI_6_3_COMMON_HEADER*)(*table_address);
- Print(L"\t%c%c%c%c table is placed at address %p with length 0x%x\n",
- (CHAR8)((table->Signature>> 0)&0xFF),
- (CHAR8)((table->Signature>> 8)&0xFF),
- (CHAR8)((table->Signature>>16)&0xFF),
- (CHAR8)((table->Signature>>24)&0xFF),
+ CHAR16 TableName[5];
+ TableName[0] = (CHAR16)((table->Signature>> 0)&0xFF);
+ TableName[1] = (CHAR16)((table->Signature>> 8)&0xFF);
+ TableName[2] = (CHAR16)((table->Signature>>16)&0xFF);
+ TableName[3] = (CHAR16)((table->Signature>>24)&0xFF);
+ TableName[4] = 0;
+
+ Print(L"\t%s table is placed at address %p with length 0x%x\n",
+ TableName,
table,
table->Length);
+ CHAR16 FileName[9] = {0};
+ StrCpyS(FileName, 9, TableName);
+ StrCatS(FileName, 9, L".aml");
+ SHELL_FILE_HANDLE FileHandle;
+ Status = ShellProtocol->OpenFileByName(FileName,
+ &FileHandle,
+ EFI_FILE_MODE_CREATE | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ);
+ if (!EFI_ERROR(Status)) {
+ UINTN size = table->Length;
+ Status = ShellProtocol->WriteFile(FileHandle, &size, (VOID*)table);
+ if (EFI_ERROR(Status)) {
+ Print(L"Error in WriteFile: %r\n", Status);
+ }
+ Status = ShellProtocol->CloseFile(FileHandle);
+ if (EFI_ERROR(Status)) {
+ Print(L"Error in CloseFile: %r\n", Status);
+ }
+ } else {
+ Print(L"Error in OpenFileByName: %r\n", Status);
+ }
offset += sizeof(UINT64);
}