pretty code

2020年11月27日 星期五

UefiMain Entry 的應用

忘記在哪裡看過,只要有 UDK Base,其實一個簡單的 Hello World 小程式也可以成為一個簡單的 Shell,我曾經試過 main Entry 的 Hello World,但只會出現 Disk Error 的錯誤訊息。

昨天看了 LAB-Z 的文章,裡面有提到一個日本人寫的書,我才恍然大悟為什麼之前無法成功,差別在我們需要使用 UefiMain Entry,而不是 StdLib 的 main Entry。

雖然曾稍微看過 Shell.c 的 code,也知道它是使用 UefiMain Entry,但我一直以為寫 Shell 有點像是寫 Windows Service 或者像在寫一支 Driver,有對應的介面需實作,這樣 OS 才能跟你寫的程式溝通,搞了半天,原來一切都是我想太多!

只要下面簡單幾行,並把編譯完的檔案改名成 BootX64.efi,放在隨身碟 EFI\Boot 下,開機時就會執行你的小程式。

#include <Library/UefiBootServicesTableLib.h>

EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
    // Clear the screen
    EFI_STATUS Status;
    Status = gST->ConOut->ClearScreen(gST->ConOut);
    if (EFI_ERROR(Status)) {
        return (Status);
    }

    // turn off the watchdog timer
    gBS->SetWatchdogTimer (0, 0, 0, NULL);

    gST->ConOut->OutputString(gST->ConOut, L"Enter UefiMain \r\n");

    while (1) {

    }

    return EFI_SUCCESS;
}

沒有留言: