UEFI 基础教程 (十三) - VFR,HFR 简单使用 oneof btn
创始人
2025-05-31 15:01:02

一、 修改UEFI UiApp源代码
修改 FrontPageStrings.uni 与 FrontPageVfr.Vfr
添加字符串资源到 MdeModulePkg/Application/UiApp/FrontPageStrings.uni
//Add CSDN UI resources
#string STR_CSDN_BANNER_LEFT #language en-US “Csdn Bannder Left”
#string STR_CSDN_BANNER_RIGHT #language en-US “Csdn Bannder Right”

#string STR_CSDN_STRING #language en-US “CsdnText”
#language fr-FR “CsdnText”
#string STR_CSDN_STRING_HELP #language en-US “CsdnText the current setting.”
#language fr-FR “CsdnText the current setting.”

#string STR_CSDN_RADIO_STRING #language en-US “CsdnRdioBtn”
#language fr-FR “CsdnRdioBtn”
#string STR_CSDN_RADIO_STRING_HELP #language en-US “CsdnRadio the current setting.”
#language fr-FR “CsdnRadio the current setting.”

#string STR_CSDN_STRING_RADIO_1 #language en-US “Csdn Radio Button No 1”
#string STR_CSDN_STRING_RADIO_2 #language en-US “Csdn Radio Button No 2”
#string STR_CSDN_STRING_RADIO_3 #language en-US “Csdn Radio Button No 3”
#string STR_CSDN_STRING_RADIO_4 #language en-US “Csdn Radio Button No 4”
#string STR_CSDN_STRING_RADIO_5 #language en-US “Csdn Radio Button No 5”
#string STR_CSDN_STRING_RADIO_6 #language en-US “Csdn Radio Button No 6”
#string STR_CSDN_STRING_RADIO_7 #language en-US “Csdn Radio Button No 7”

修改 FrontPageVfr.Vfr的Lable
MdeModulePkg/Application/UiApp/FrontPageVfr.Vfr

bannertitle = STRING_TOKEN(STR_CSDN_BANNER_LEFT),line  4,align left;bannertitle = STRING_TOKEN(STR_CSDN_BANNER_RIGHT),line  4,align right;

修改 FrontPageCustomizedUi.c 与 FrontPageCustomizedUiSupport.c
添加 Oneof(RadioButton) 菜单
MdeModulePkg/Application/UiApp/FrontPageCustomizedUi.c
/**
Customize menus in the page.

@param[in] HiiHandle The HII Handle of the form to update.
@param[in] StartOpCodeHandle The context used to insert opcode.
@param[in] CustomizePageType The page type need to be customized.

**/
VOID
UiCustomizeFrontPage (
IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle
)
{
//
// Create “Select CSDN” menu with Oneof opcode.
//
UiCreateCsdnRadioMenu(HiiHandle, StartOpCodeHandle);

//
// Create csdn menu.
//
UiCreateCsdnMenu(HiiHandle, StartOpCodeHandle);
}

MdeModulePkg/Application/UiApp/FrontPageCustomizedUiSupport.c

// 定义 CallBack
EFI_STATUS
CsdnRadioChangeHandler (
IN EFI_IFR_TYPE_VALUE *Value
)
{
EFI_STATUS Status;

CHAR8 *CsdnText = “Csdn Radio Button No 1”;
DEBUG((EFI_D_INFO,“[csdn] CsdnRadioChangeHandler value=%x\n”,Value->u8));

Status = gRT->SetVariable (
L"CSDNRadioButtonText",
&gEfiIfrFrontPageGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
22,
CsdnText
);
if (EFI_ERROR (Status)) {
DEBUG((EFI_D_INFO,“[csdn] CsdnRadioChangeHandler status=%r\n”,Status));
return EFI_DEVICE_ERROR;
}
return EFI_SUCCESS;
}

//触发 CallBack
BOOLEAN
UiSupportLibCallbackHandler (
IN EFI_HII_HANDLE HiiHandle,
IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest,
OUT EFI_STATUS *Status
){

switch (QuestionId) {
case FRONT_PAGE_KEY_CONTINUE:
//
// This is the continue - clear the screen and return an error to get out of FrontPage loop
//
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
break;

//CallBack 触发入口
case FRONT_PAGE_KEY_CSDN_RADIIO:*Status = CsdnRadioChangeHandler(Value);break;default:break;
}

}

二、 编译生成EFI文件
运行edksetup.bat && build -a X64 -p OvmfPkg\OvmfPkgX64.dsc -D DEBUG_ON_SERIAL_PORT -t VS2013x86编译整个OvmfPkg Package

三、 运行 UEFI
执行setup-qemu-x64.bat | findstr csdn
四、 小结
在UEFI平台可以通过修改 VFR/HFR等相关文件来配置SETUP界面, 其中
UNI文件用来存放资源, C文件用作driver 用来动态更新配置值。
在这里插入图片描述

相关内容

热门资讯

退市苏吴:股票于12月9日进入... 新京报贝壳财经讯 退市苏吴12月16日公告,公司A股股票于2025年12月12日、2025年12月1...
云南3名村民擅入封闭矿硐窒息死... 出事硐口警示标志 今年8月22日,云南迪庆州维西县白济汛乡3名村民私自破坏长期停用探矿硐封堵设施进入...
甘露特钠迎转机,复星医药拟控股... 12月15日,复星医药宣布,控股子公司复星医药产业与绿谷(上海)医药科技有限公司(“绿谷医药”)及其...
“铁饭碗”迟早要打破? 文/洛水钟鸣(识局微信公共账号zhijuzk)到了今天,谁要再说体制内是“金饭碗”,只能说明他太不了...
卖早餐的蜜雪冰城,被嫌弃了? 近日,蜜雪冰城在大连、西安、南宁和杭州4座试点城市上线早餐产品。 图源:蜜雪冰城小程序 产品线分...