一般來說,我們在取 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;
}
// 底下省略
}
沒有留言:
張貼留言