2019年7月12日 星期五

UEFI Boot Variable 取值注意事項

困擾我一個星期的問題終於解決了!

一般來說,我們在取 Boot Variable 時,會先取得 BootOrder 這個變數的內容,因為裡面的 1 個開機項目是 2 Byte,故我們會把取到的 BootOrder size 除以 2 好方便我們取得所有項目個數,之後就可以用 for 迴圈依序取得 Boot Variable。

好死不死的,我們系統的的 BootOrder 是長底下這樣,故我先取 Boot0001 當然會取不到,害我一直往 EDK1/EDK2 的方向去找問題。另外,變數名稱前面不需要加上 "Efi:"。


sample code 如下:

    orderValue = mGetVariable(L"BootOrder", &gEfiGlobalVariableGuid, &size);
    if (orderValue == NULL) {
        printf("Can't get BootOrder Variable \n");
        return ERROR;
    }

    varCount = size / 2;
    for (i = 0; i < varCount; i++) {
        ptr = (char*)orderValue;
        num = (UINT16*)(ptr + i * 2);
        
        UnicodeSPrint(bootString, sizeof(bootString), L"Boot%04x", *num);
        
        value = mGetVariable(bootString, &gEfiGlobalVariableGuid, &size);
        if (value == NULL) {
            printf("Can't get Boot%04X Variable \n", i);
            return ERROR;
        }
        
        // 底下省略
    }

沒有留言:

張貼留言