driversample.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 648 行 · 第 1/2 页
C
648 行
//
Private->Hii->UpdateForm (
Private->Hii,
Private->RegisteredHandle,
(EFI_FORM_LABEL) 0x1234, // Label 0x1234
FALSE, // Remove Op-codes (will never remove form/endform)
UpdateData // Significant value is UpdateData->DataCount
);
UpdateData->FormSetUpdate = FALSE;
UpdateData->FormCallbackHandle = 0;
UpdateData->FormUpdate = FALSE;
UpdateData->FormTitle = 0;
UpdateData->DataCount = 1;
CreateGotoOpCode (
1,
STR_GOTO_FORM1, // Token value for the Prompt
0, // Goto Help
0, // Flags
0, // Key
&UpdateData->Data // Buffer location to place op-codes
);
Private->Hii->UpdateForm (
Private->Hii,
Private->RegisteredHandle,
(EFI_FORM_LABEL) 0x1234,
TRUE,
UpdateData
);
gBS->FreePool (UpdateData);
break;
case 0x1236:
//
// If I hit the checkbox, I enter this case statement...
//
//
// Since I am returning an error (for test purposes) I need to pass in the string for the error
// I will allocate space for the return value. If an error occurs (which is the case) I can simply return
// an error and fill in the string parameter, otherwise, I will return information in the DataArray structure.
// The browser will free this packet structure
//
Status = gBS->AllocatePool (
EfiBootServicesData,
sizeof (EFI_HII_CALLBACK_PACKET) + sizeof (SAMPLE_STRING) + 2,
Packet
);
ASSERT_EFI_ERROR (Status);
EfiZeroMem (*Packet, sizeof (EFI_HII_CALLBACK_PACKET) + sizeof (SAMPLE_STRING) + 2);
//
// Assign the buffer address to DataPacket
//
DataPacket = *Packet;
EfiStrCpy (DataPacket->String, SAMPLE_STRING);
return EFI_DEVICE_ERROR;
case 0x1237:
Status = gBS->AllocatePool (
EfiBootServicesData,
sizeof (EFI_HII_CALLBACK_PACKET) + 2,
Packet
);
ASSERT_EFI_ERROR (Status);
EfiZeroMem (*Packet, sizeof (EFI_HII_CALLBACK_PACKET) + 2);
//
// Assign the buffer address to DataPacket
//
DataPacket = *Packet;
DataPacket->DataArray.EntryCount = 1;
DataPacket->DataArray.NvRamMap = NULL;
DataPacket->DataArray.Data->Flags = EXIT_REQUIRED;
break;
case 0x1555:
Value = 0x0001;
SPrint (VariableName, 0x80, L"%d", VAR_EQ_TEST_NAME);
Status = gRT->SetVariable (
VariableName,
&FormSetGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
2,
(VOID *) &Value
);
break;
case 0x1556:
Value = 0x1000;
SPrint (VariableName, 0x80, L"%d", VAR_EQ_TEST_NAME);
Status = gRT->SetVariable (
VariableName,
&FormSetGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
2,
(VOID *) &Value
);
break;
case 0x1557:
Value = 0x0000;
SPrint (VariableName, 0x80, L"%d", VAR_EQ_TEST_NAME);
Status = gRT->SetVariable (
VariableName,
&FormSetGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
2,
(VOID *) &Value
);
break;
default:
break;
}
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
DriverSampleInit (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_HII_PROTOCOL *Hii;
//
// EFI_FORM_BROWSER_PROTOCOL *FormConfig;
//
EFI_HII_PACKAGES *PackageList;
EFI_HII_HANDLE HiiHandle;
STRING_REF TokenToUpdate;
STRING_REF TokenToUpdate2;
STRING_REF TokenToUpdate3;
CHAR16 *NewString;
EFI_HII_UPDATE_DATA *UpdateData;
EFI_CALLBACK_INFO *CallbackInfo;
EFI_HANDLE Handle;
SCREEN_DESCRIPTOR Screen;
EFI_GUID StringPackGuid = STRING_PACK_GUID;
//
// Initialize the library and our protocol.
//
EfiInitializeDriverLib (ImageHandle, SystemTable);
EfiZeroMem (&Screen, sizeof (SCREEN_DESCRIPTOR));
gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &Screen.RightColumn, &Screen.BottomRow);
//
// Remove 3 characters from top and bottom
//
Screen.TopRow = 3;
Screen.BottomRow = Screen.BottomRow - 3;
//
// There should only be one HII protocol
//
Status = gBS->LocateProtocol (
&gEfiHiiProtocolGuid,
NULL,
&Hii
);
if (EFI_ERROR (Status)) {
return Status;;
}
/*
//
// There should only be one Form Configuration protocol
//
Status = gBS->LocateProtocol (
&gEfiFormBrowserProtocolGuid,
NULL,
&FormConfig
);
if (EFI_ERROR (Status)) {
return Status;;
}
*/
Status = gBS->AllocatePool (
EfiBootServicesData,
sizeof (EFI_CALLBACK_INFO),
&CallbackInfo
);
if (EFI_ERROR (Status)) {
return Status;
}
CallbackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;
CallbackInfo->Hii = Hii;
//
// This example does not implement worker functions for the NV accessor functions. Only a callback evaluator
//
CallbackInfo->DriverCallback.NvRead = NULL;
CallbackInfo->DriverCallback.NvWrite = NULL;
CallbackInfo->DriverCallback.Callback = DriverCallback;
//
// Install protocol interface
//
Handle = NULL;
Status = gBS->InstallProtocolInterface (
&Handle,
&gEfiFormCallbackProtocolGuid,
EFI_NATIVE_INTERFACE,
&CallbackInfo->DriverCallback
);
ASSERT_EFI_ERROR (Status);
CallbackInfo->CallbackHandle = Handle;
PackageList = PreparePackages (1, &StringPackGuid, DriverSampleStrings);
Status = Hii->NewPack (Hii, PackageList, &HiiHandle);
gBS->FreePool (PackageList);
PackageList = PreparePackages (1, &StringPackGuid, InventoryBin);
Status = Hii->NewPack (Hii, PackageList, &HiiHandle);
gBS->FreePool (PackageList);
PackageList = PreparePackages (1, &StringPackGuid, VfrBin);
Status = Hii->NewPack (Hii, PackageList, &HiiHandle);
gBS->FreePool (PackageList);
CallbackInfo->RegisteredHandle = HiiHandle;
//
// Very simple example of how one would update a string that is already
// in the HII database
//
TokenToUpdate = (STRING_REF) STR_CPU_STRING2;
NewString = L"700 Mhz";
Hii->NewString (Hii, NULL, HiiHandle, &TokenToUpdate, NewString);
//
// Add a string - if 0 will be updated with new Token number
//
TokenToUpdate = (STRING_REF) 0;
//
// Add a string - if 0 will be updated with new Token number
//
TokenToUpdate2 = (STRING_REF) 0;
//
// Add a string - if 0 will be updated with new Token number
//
TokenToUpdate3 = (STRING_REF) 0;
Hii->NewString (Hii, NULL, HiiHandle, &TokenToUpdate, L"Desired Speed");
Hii->NewString (Hii, NULL, HiiHandle, &TokenToUpdate2, L"5 Thz");
Hii->NewString (Hii, NULL, HiiHandle, &TokenToUpdate3, L"This is next year's desired speed - right?");
//
// Allocate space for creation of Buffer
//
Status = gBS->AllocatePool (
EfiBootServicesData,
0x1000,
&UpdateData
);
ASSERT_EFI_ERROR (Status);
EfiZeroMem (UpdateData, 0x1000);
//
// Flag update pending in FormSet
//
UpdateData->FormSetUpdate = TRUE;
//
// Register CallbackHandle data for FormSet
//
UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackInfo->CallbackHandle;
UpdateData->FormUpdate = FALSE;
UpdateData->FormTitle = 0;
UpdateData->DataCount = 1;
CreateTextOpCode (TokenToUpdate, TokenToUpdate2, TokenToUpdate3, 0, 0, &UpdateData->Data);
Hii->UpdateForm (Hii, HiiHandle, (EFI_FORM_LABEL) 100, TRUE, UpdateData);
gBS->FreePool (UpdateData);
//
// Example of how to display only the item we sent to HII
//
if (DISPLAY_ONLY_MY_ITEM == 0x0001) {
//
// Have the browser pull out our copy of the data, and only display our data
//
// Status = FormConfig->SendForm (FormConfig, TRUE, HiiHandle, NULL, NULL, NULL, &Screen, NULL);
//
} else {
//
// Have the browser pull out all the data in the HII Database and display it.
//
// Status = FormConfig->SendForm (FormConfig, TRUE, 0, NULL, NULL, NULL, NULL, NULL);
//
}
if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?