variable.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,280 行 · 第 1/3 页
C
1,280 行
for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
if (NULL == NewMenuEntry) {
return EFI_NOT_FOUND;
}
NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) ||
(NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) ||
(NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID))
) {
Vendor.Header.Type = MESSAGING_DEVICE_PATH;
Vendor.Header.SubType = MSG_VENDOR_DP;
EfiCopyMem (
&Vendor.Guid,
&Guid[NewTerminalContext->TerminalType],
sizeof (EFI_GUID)
);
SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));
TerminalDevicePath = EfiAppendDevicePathNode (
NewTerminalContext->DevicePath,
(EFI_DEVICE_PATH_PROTOCOL *) &Vendor
);
ASSERT (TerminalDevicePath != NULL);
ChangeTerminalDevicePath (TerminalDevicePath, TRUE);
Temp = DevicePathToStr (TerminalDevicePath);
ConDevicePath = EfiAppendDevicePathInstance (
ConDevicePath,
TerminalDevicePath
);
}
}
if (ConDevicePath) {
Status = gRT->SetVariable (
ConsoleName,
&gEfiGlobalVariableGuid,
VAR_FLAG,
EfiDevicePathSize (ConDevicePath),
ConDevicePath
);
if (EFI_ERROR (Status)) {
return Status;
}
}
return EFI_SUCCESS;
}
EFI_STATUS
Var_UpdateConsoleInpOption (
VOID
)
{
return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);
}
EFI_STATUS
Var_UpdateConsoleOutOption (
VOID
)
{
return Var_UpdateConsoleOption (L"ConOut", &ConsoleOutMenu, FORM_CON_OUT_ID);
}
EFI_STATUS
Var_UpdateErrorOutOption (
VOID
)
{
return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);
}
EFI_STATUS
Var_UpdateDriverOption (
IN BMM_CALLBACK_DATA *CallbackData,
IN EFI_HII_HANDLE HiiHandle,
IN UINT16 *DescriptionData,
IN UINT16 *OptionalData,
IN UINT8 ForceReconnect
)
{
UINT16 Index;
UINT16 *DriverOrderList;
UINT16 *NewDriverOrderList;
UINT16 DriverString[12];
UINTN DriverOrderListSize;
VOID *Buffer;
UINTN BufferSize;
UINT8 *Ptr;
BM_MENU_ENTRY *NewMenuEntry;
BM_LOAD_CONTEXT *NewLoadContext;
BOOLEAN OptionalDataExist;
EFI_STATUS Status;
OptionalDataExist = FALSE;
Index = BOpt_GetDriverOptionNumber ();
SPrint (
DriverString,
sizeof (DriverString),
L"Driver%04x",
Index
);
if (*DescriptionData == 0x0000) {
EfiStrCpy (DescriptionData, DriverString);
}
BufferSize = sizeof (UINT32) + sizeof (UINT16) + EfiStrSize (DescriptionData) + EfiDevicePathSize (CallbackData->LoadContext->FilePathList);
if (*OptionalData != 0x0000) {
OptionalDataExist = TRUE;
BufferSize += EfiStrSize (OptionalData);
}
Buffer = EfiAllocateZeroPool (BufferSize);
if (NULL == Buffer) {
return EFI_OUT_OF_RESOURCES;
}
NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);
if (NULL == NewMenuEntry) {
return EFI_OUT_OF_RESOURCES;
}
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
NewLoadContext->Deleted = FALSE;
NewLoadContext->LoadOptionSize = BufferSize;
Ptr = (UINT8 *) Buffer;
NewLoadContext->LoadOption = Ptr;
*((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);
NewLoadContext->Attributes = *((UINT32 *) Ptr);
NewLoadContext->IsActive = TRUE;
NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);
Ptr += sizeof (UINT32);
*((UINT16 *) Ptr) = (UINT16) EfiDevicePathSize (CallbackData->LoadContext->FilePathList);
NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);
Ptr += sizeof (UINT16);
EfiCopyMem (
Ptr,
DescriptionData,
EfiStrSize (DescriptionData)
);
NewLoadContext->Description = EfiAllocateZeroPool (EfiStrSize (DescriptionData));
ASSERT (NewLoadContext->Description != NULL);
NewMenuEntry->DisplayString = NewLoadContext->Description;
EfiCopyMem (
NewLoadContext->Description,
(VOID *) Ptr,
EfiStrSize (DescriptionData)
);
Ptr += EfiStrSize (DescriptionData);
EfiCopyMem (
Ptr,
CallbackData->LoadContext->FilePathList,
EfiDevicePathSize (CallbackData->LoadContext->FilePathList)
);
NewLoadContext->FilePathList = EfiAllocateZeroPool (EfiDevicePathSize (CallbackData->LoadContext->FilePathList));
ASSERT (NewLoadContext->FilePathList != NULL);
EfiCopyMem (
NewLoadContext->FilePathList,
(VOID *) Ptr,
EfiDevicePathSize (CallbackData->LoadContext->FilePathList)
);
NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);
NewMenuEntry->OptionNumber = Index;
NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (
CallbackData,
DriverOptionStrDepository
);
CallbackData->Hii->NewString (
CallbackData->Hii,
NULL,
HiiHandle,
&NewMenuEntry->DisplayStringToken,
NewMenuEntry->DisplayString
);
NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (
CallbackData,
DriverOptionHelpStrDepository
);
CallbackData->Hii->NewString (
CallbackData->Hii,
NULL,
HiiHandle,
&NewMenuEntry->HelpStringToken,
NewMenuEntry->HelpString
);
if (OptionalDataExist) {
Ptr += (UINT8) EfiDevicePathSize (CallbackData->LoadContext->FilePathList);
EfiCopyMem (
Ptr,
OptionalData,
EfiStrSize (OptionalData)
);
}
Status = gRT->SetVariable (
DriverString,
&gEfiGlobalVariableGuid,
VAR_FLAG,
BufferSize,
Buffer
);
DriverOrderList = BdsLibGetVariableAndSize (
L"DriverOrder",
&gEfiGlobalVariableGuid,
&DriverOrderListSize
);
NewDriverOrderList = EfiAllocateZeroPool (DriverOrderListSize + sizeof (UINT16));
ASSERT (NewDriverOrderList != NULL);
EfiCopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);
NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;
if (DriverOrderList != NULL) {
EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);
}
Status = gRT->SetVariable (
L"DriverOrder",
&gEfiGlobalVariableGuid,
VAR_FLAG,
DriverOrderListSize + sizeof (UINT16),
NewDriverOrderList
);
SafeFreePool (DriverOrderList);
DriverOrderList = NULL;
SafeFreePool (NewDriverOrderList);
NewDriverOrderList = NULL;
InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);
DriverOptionMenu.MenuNumber++;
*DescriptionData = 0x0000;
*OptionalData = 0x0000;
return EFI_SUCCESS;
}
EFI_STATUS
Var_UpdateBootOption (
IN BMM_CALLBACK_DATA *CallbackData,
IN FILE_EXPLORER_NV_DATA *NvRamMap
)
{
UINT16 *BootOrderList;
UINT16 *NewBootOrderList;
UINTN BootOrderListSize;
UINT16 BootString[10];
VOID *Buffer;
UINTN BufferSize;
UINT8 *Ptr;
UINT16 Index;
BM_MENU_ENTRY *NewMenuEntry;
BM_LOAD_CONTEXT *NewLoadContext;
BOOLEAN OptionalDataExist;
EFI_STATUS Status;
OptionalDataExist = FALSE;
Index = BOpt_GetBootOptionNumber () ;
SPrint (BootString, sizeof (BootString), L"Boot%04x", Index);
if (NvRamMap->DescriptionData[0] == 0x0000) {
EfiStrCpy (NvRamMap->DescriptionData, BootString);
}
BufferSize = sizeof (UINT32) + sizeof (UINT16) + EfiStrSize (NvRamMap->DescriptionData) + EfiDevicePathSize (CallbackData->LoadContext->FilePathList);
if (NvRamMap->OptionalData[0] != 0x0000) {
OptionalDataExist = TRUE;
BufferSize += EfiStrSize (NvRamMap->OptionalData);
}
Buffer = EfiAllocateZeroPool (BufferSize);
if (NULL == Buffer) {
return EFI_OUT_OF_RESOURCES;
}
NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);
if (NULL == NewMenuEntry) {
return EFI_OUT_OF_RESOURCES;
}
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
NewLoadContext->Deleted = FALSE;
NewLoadContext->LoadOptionSize = BufferSize;
Ptr = (UINT8 *) Buffer;
NewLoadContext->LoadOption = Ptr;
*((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;
NewLoadContext->Attributes = *((UINT32 *) Ptr);
NewLoadContext->IsActive = TRUE;
NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);
Ptr += sizeof (UINT32);
*((UINT16 *) Ptr) = (UINT16) EfiDevicePathSize (CallbackData->LoadContext->FilePathList);
NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);
Ptr += sizeof (UINT16);
EfiCopyMem (
Ptr,
NvRamMap->DescriptionData,
EfiStrSize (NvRamMap->DescriptionData)
);
NewLoadContext->Description = EfiAllocateZeroPool (EfiStrSize (NvRamMap->DescriptionData));
ASSERT (NewLoadContext->Description != NULL);
NewMenuEntry->DisplayString = NewLoadContext->Description;
EfiCopyMem (
NewLoadContext->Description,
(VOID *) Ptr,
EfiStrSize (NvRamMap->DescriptionData)
);
Ptr += EfiStrSize (NvRamMap->DescriptionData);
EfiCopyMem (
Ptr,
CallbackData->LoadContext->FilePathList,
EfiDevicePathSize (CallbackData->LoadContext->FilePathList)
);
NewLoadContext->FilePathList = EfiAllocateZeroPool (EfiDevicePathSize (CallbackData->LoadContext->FilePathList));
ASSERT (NewLoadContext->FilePathList != NULL);
EfiCopyMem (
NewLoadContext->FilePathList,
(VOID *) Ptr,
EfiDevicePathSize (CallbackData->LoadContext->FilePathList)
);
NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);
NewMenuEntry->OptionNumber = Index;
NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (
CallbackData,
BootOptionStrDepository
);
CallbackData->Hii->NewString (
CallbackData->Hii,
NULL,
CallbackData->FeHiiHandle,
&NewMenuEntry->DisplayStringToken,
NewMenuEntry->DisplayString
);
NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (
CallbackData,
BootOptionHelpStrDepository
);
CallbackData->Hii->NewString (
CallbackData->Hii,
NULL,
CallbackData->FeHiiHandle,
&NewMenuEntry->HelpStringToken,
NewMenuEntry->HelpString
);
if (OptionalDataExist) {
Ptr += (UINT8) EfiDevicePathSize (CallbackData->LoadContext->FilePathList);
EfiCopyMem (Ptr, NvRamMap->OptionalData, EfiStrSize (NvRamMap->OptionalData));
}
Status = gRT->SetVariable (
BootString,
&gEfiGlobalVariableGuid,
VAR_FLAG,
BufferSize,
Buffer
);
BootOrderList = BdsLibGetVariableAndSize (
L"BootOrder",
&gEfiGlobalVariableGuid,
&BootOrderListSize
);
NewBootOrderList = EfiAllocateZeroPool (BootOrderListSize + sizeof (UINT16));
ASSERT (NewBootOrderList != NULL);
EfiCopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);
NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;
if (BootOrderList != NULL) {
EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);
}
Status = gRT->SetVariable (
L"BootOrder",
&gEfiGlobalVariableGuid,
VAR_FLAG,
BootOrderListSize + sizeof (UINT16),
NewBootOrderList
);
SafeFreePool (BootOrderList);
BootOrderList = NULL;
SafeFreePool (NewBootOrderList);
NewBootOrderList = NULL;
InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);
BootOptionMenu.MenuNumber++;
NvRamMap->DescriptionData[0] = 0x0000;
NvRamMap->OptionalData[0] = 0x0000;
return EFI_SUCCESS;
}
EFI_STATUS
Var_UpdateBootNext (
IN BMM_CALLBACK_DATA *CallbackData
)
{
BM_MENU_ENTRY *NewMenuEntry;
BM_LOAD_CONTEXT *NewLoadContext;
BMM_FAKE_NV_DATA *CurrentFakeNVMap;
UINT16 Index;
EFI_STATUS Status;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?