X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FDriverSampleDxe%2FDriverSample.c;h=87ffac827903fe9312638c3b7ab64bb5744f1aa4;hb=84f9a9ec8f84f837b3c0addf1f4681d8f8c71db1;hp=9e82009e82e2138d2ac97282b152a43947de22a0;hpb=7064c0a5aa3eabe99be9c143e4abaa73d7139609;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c index 9e82009e82..87ffac8279 100644 --- a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c +++ b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c @@ -1,4 +1,7 @@ /** @file +This is an example of how a driver might export data to the HII protocol to be +later utilized by the Setup Protocol + Copyright (c) 2004 - 2008, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -8,15 +11,6 @@ http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -Module Name: - DriverSample.c - -Abstract: - - This is an example of how a driver might export data to the HII protocol to be - later utilized by the Setup Protocol - - **/ @@ -29,6 +23,59 @@ EFI_GUID mInventoryGuid = INVENTORY_GUID; CHAR16 VariableName[] = L"MyIfrNVData"; +EFI_HANDLE DriverHandle[2] = {NULL, NULL}; +DRIVER_SAMPLE_PRIVATE_DATA *PrivateData = NULL; + +HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath0 = { + { + { + HARDWARE_DEVICE_PATH, + HW_VENDOR_DP, + { + (UINT8) (sizeof (VENDOR_DEVICE_PATH)), + (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) + } + }, + // + // {C153B68D-EBFC-488e-B110-662867745B87} + // + { 0xc153b68d, 0xebfc, 0x488e, { 0xb1, 0x10, 0x66, 0x28, 0x67, 0x74, 0x5b, 0x87 } } + }, + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + { + (UINT8) (END_DEVICE_PATH_LENGTH), + (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) + } + } +}; + +HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath1 = { + { + { + HARDWARE_DEVICE_PATH, + HW_VENDOR_DP, + { + (UINT8) (sizeof (VENDOR_DEVICE_PATH)), + (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) + } + }, + // + // {06F37F07-0C48-40e9-8436-0A08A0BB76B0} + // + { 0x6f37f07, 0xc48, 0x40e9, { 0x84, 0x36, 0xa, 0x8, 0xa0, 0xbb, 0x76, 0xb0 } } + }, + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + { + (UINT8) (END_DEVICE_PATH_LENGTH), + (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) + } + } +}; + /** Encode the password using a simple algorithm. @@ -39,7 +86,7 @@ CHAR16 VariableName[] = L"MyIfrNVData"; VOID EncodePassword ( IN CHAR16 *Password, - IN UINT8 MaxSize + IN UINTN MaxSize ) { UINTN Index; @@ -59,7 +106,7 @@ EncodePassword ( CopyMem (Password, Buffer, MaxSize); - gBS->FreePool (Buffer); + FreePool (Buffer); return ; } @@ -81,6 +128,7 @@ ValidatePassword ( EFI_STATUS Status; UINTN Index; UINTN BufferSize; + UINTN PasswordMaxSize; CHAR16 *Password; CHAR16 *EncodedPassword; BOOLEAN OldPassword; @@ -104,10 +152,11 @@ ValidatePassword ( } OldPassword = FALSE; + PasswordMaxSize = sizeof (PrivateData->Configuration.WhatIsThePassword2); // // Check whether we have any old password set // - for (Index = 0; Index < 20; Index++) { + for (Index = 0; Index < PasswordMaxSize / sizeof (UINT16); Index++) { if (PrivateData->Configuration.WhatIsThePassword2[Index] != 0) { OldPassword = TRUE; break; @@ -123,23 +172,23 @@ ValidatePassword ( // // Get user input password // - BufferSize = 21 * sizeof (CHAR16); - Password = AllocateZeroPool (BufferSize); - ASSERT (Password != NULL); - - Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize); - if (EFI_ERROR (Status)) { - gBS->FreePool (Password); - return Status; + Password = HiiGetString (PrivateData->HiiHandle[0], StringId, NULL); + if (Password == NULL) { + return EFI_NOT_READY; + } + if (StrSize (Password) > PasswordMaxSize) { + FreePool (Password); + return EFI_NOT_READY; } // // Validate old password // - EncodedPassword = AllocateCopyPool (21 * sizeof (CHAR16), Password); + EncodedPassword = AllocateZeroPool (PasswordMaxSize); ASSERT (EncodedPassword != NULL); - EncodePassword (EncodedPassword, 20 * sizeof (CHAR16)); - if (CompareMem (EncodedPassword, PrivateData->Configuration.WhatIsThePassword2, 20 * sizeof (CHAR16)) != 0) { + StrnCpy (EncodedPassword, Password, StrLen (Password)); + EncodePassword (EncodedPassword, StrLen (EncodedPassword) * sizeof (CHAR16)); + if (CompareMem (EncodedPassword, PrivateData->Configuration.WhatIsThePassword2, StrLen (EncodedPassword) * sizeof (CHAR16)) != 0) { // // Old password mismatch, return EFI_NOT_READY to prompt for error message // @@ -148,8 +197,8 @@ ValidatePassword ( Status = EFI_SUCCESS; } - gBS->FreePool (Password); - gBS->FreePool (EncodedPassword); + FreePool (Password); + FreePool (EncodedPassword); return Status; } @@ -171,9 +220,11 @@ SetPassword ( ) { EFI_STATUS Status; - UINTN BufferSize; CHAR16 *Password; + CHAR16 *TempPassword; + UINTN PasswordSize; DRIVER_SAMPLE_CONFIGURATION *Configuration; + UINTN BufferSize; // // Get Buffer Storage data from EFI variable @@ -194,43 +245,53 @@ SetPassword ( // Get user input password // Password = &PrivateData->Configuration.WhatIsThePassword2[0]; - ZeroMem (Password, 20 * sizeof (CHAR16)); - Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize); - if (EFI_ERROR (Status)) { - return Status; + PasswordSize = sizeof (PrivateData->Configuration.WhatIsThePassword2); + ZeroMem (Password, PasswordSize); + + TempPassword = HiiGetString (PrivateData->HiiHandle[0], StringId, NULL); + if (TempPassword == NULL) { + return EFI_NOT_READY; + } + if (StrSize (TempPassword) > PasswordSize) { + FreePool (TempPassword); + return EFI_NOT_READY; } + StrnCpy (Password, TempPassword, StrLen (TempPassword)); + FreePool (TempPassword); // // Retrive uncommitted data from Browser // - BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION); - Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA)); + Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_CONFIGURATION)); ASSERT (Configuration != NULL); - Status = GetBrowserData (&mFormSetGuid, VariableName, &BufferSize, (UINT8 *) Configuration); - if (!EFI_ERROR (Status)) { + if (HiiGetBrowserData (&mFormSetGuid, VariableName, sizeof (DRIVER_SAMPLE_CONFIGURATION), (UINT8 *) Configuration)) { // // Update password's clear text in the screen // - CopyMem (Configuration->PasswordClearText, Password, 20 * sizeof (CHAR16)); + CopyMem (Configuration->PasswordClearText, Password, StrSize (Password)); // // Update uncommitted data of Browser // - BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION); - Status = SetBrowserData ( - &mFormSetGuid, - VariableName, - BufferSize, - (UINT8 *) Configuration, - NULL - ); + HiiSetBrowserData ( + &mFormSetGuid, + VariableName, + sizeof (DRIVER_SAMPLE_CONFIGURATION), + (UINT8 *) Configuration, + NULL + ); } - gBS->FreePool (Configuration); + + // + // Free Configuration Buffer + // + FreePool (Configuration); + // // Set password // - EncodePassword (Password, 20 * sizeof (CHAR16)); + EncodePassword (Password, StrLen (Password) * 2); Status = gRT->SetVariable( VariableName, &mFormSetGuid, @@ -281,56 +342,65 @@ ExtractConfig ( UINTN BufferSize; DRIVER_SAMPLE_PRIVATE_DATA *PrivateData; EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting; + EFI_STRING ConfigRequestHdr; + EFI_STRING ConfigRequest; + UINTN Size; + + // + // Initialize the local variables. + // + ConfigRequestHdr = NULL; + ConfigRequest = NULL; + Size = 0; + *Progress = Request; PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This); HiiConfigRouting = PrivateData->HiiConfigRouting; // - // - // Get Buffer Storage data from EFI variable + // Get Buffer Storage data from EFI variable. + // Try to get the current setting from variable. // BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION); - Status = gRT->GetVariable ( - VariableName, - &mFormSetGuid, - NULL, - &BufferSize, - &PrivateData->Configuration - ); - if (EFI_ERROR (Status)) { - return Status; - } - + gRT->GetVariable ( + VariableName, + &mFormSetGuid, + NULL, + &BufferSize, + &PrivateData->Configuration + ); + if (Request == NULL) { // - // Request is set to NULL, return all configurable elements together with ALTCFG - // - Status = ConstructConfigAltResp ( - NULL, - NULL, - Results, - &mFormSetGuid, - VariableName, - PrivateData->DriverHandle[0], - &PrivateData->Configuration, - BufferSize, - VfrMyIfrNVDataBlockName, - 2, - STRING_TOKEN (STR_STANDARD_DEFAULT_PROMPT), - VfrMyIfrNVDataDefault0000, - STRING_TOKEN (STR_MANUFACTURE_DEFAULT_PROMPT), - VfrMyIfrNVDataDefault0001 - ); + // Request is set to NULL, construct full request string. + // - return Status; + // + // First Set ConfigRequestHdr string. + // + ConfigRequestHdr = HiiConstructConfigHdr (&mFormSetGuid, VariableName, PrivateData->DriverHandle[0]); + ASSERT (ConfigRequestHdr != NULL); + + // + // Allocate and fill a buffer large enough to hold the template + // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator + // + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); + UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize); + FreePool (ConfigRequestHdr); + } else { + ConfigRequest = Request; } // // Check routing data in . // Note: if only one Storage is used, then this checking could be skipped. // - if (!IsConfigHdrMatch (Request, &mFormSetGuid, VariableName)) { - *Progress = Request; + if (!HiiIsConfigHdrMatch (ConfigRequest, &mFormSetGuid, VariableName)) { + if (Request == NULL) { + FreePool (ConfigRequest); + } return EFI_NOT_FOUND; } @@ -339,12 +409,17 @@ ExtractConfig ( // Status = HiiConfigRouting->BlockToConfig ( HiiConfigRouting, - Request, + ConfigRequest, (UINT8 *) &PrivateData->Configuration, BufferSize, Results, Progress ); + + if (Request == NULL) { + FreePool (ConfigRequest); + } + return Status; } @@ -387,10 +462,11 @@ RouteConfig ( PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This); HiiConfigRouting = PrivateData->HiiConfigRouting; + // // Check routing data in . // Note: if only one Storage is used, then this checking could be skipped. // - if (!IsConfigHdrMatch (Configuration, &mFormSetGuid, VariableName)) { + if (!HiiIsConfigHdrMatch (Configuration, &mFormSetGuid, VariableName)) { *Progress = Configuration; return EFI_NOT_FOUND; } @@ -399,16 +475,13 @@ RouteConfig ( // Get Buffer Storage data from EFI variable // BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION); - Status = gRT->GetVariable ( - VariableName, - &mFormSetGuid, - NULL, - &BufferSize, - &PrivateData->Configuration - ); - if (EFI_ERROR (Status)) { - return Status; - } + gRT->GetVariable ( + VariableName, + &mFormSetGuid, + NULL, + &BufferSize, + &PrivateData->Configuration + ); // // Convert to buffer data by helper function ConfigToBlock() @@ -475,13 +548,21 @@ DriverCallback ( { DRIVER_SAMPLE_PRIVATE_DATA *PrivateData; EFI_STATUS Status; - EFI_HII_UPDATE_DATA UpdateData; - IFR_OPTION *IfrOptionList; UINT8 MyVar; + VOID *StartOpCodeHandle; + VOID *OptionsOpCodeHandle; + EFI_IFR_GUID_LABEL *StartLabel; + VOID *EndOpCodeHandle; + EFI_IFR_GUID_LABEL *EndLabel; if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } + + if ((Type == EFI_IFR_TYPE_STRING) && (Value->string == 0)) { + return EFI_INVALID_PARAMETER; + } + Status = EFI_SUCCESS; PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This); @@ -491,139 +572,179 @@ DriverCallback ( // // Initialize the container for dynamic opcodes // - IfrLibInitUpdateData (&UpdateData, 0x1000); - - IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION)); - ASSERT (IfrOptionList != NULL); - - IfrOptionList[0].Flags = 0; - IfrOptionList[0].StringToken = STRING_TOKEN (STR_BOOT_OPTION1); - IfrOptionList[0].Value.u8 = 1; - IfrOptionList[1].Flags = EFI_IFR_OPTION_DEFAULT; - IfrOptionList[1].StringToken = STRING_TOKEN (STR_BOOT_OPTION2); - IfrOptionList[1].Value.u8 = 2; - - CreateActionOpCode ( - 0x1237, // Question ID - STRING_TOKEN(STR_EXIT_TEXT), // Prompt text - STRING_TOKEN(STR_EXIT_TEXT), // Help text - EFI_IFR_FLAG_CALLBACK, // Question flag - 0, // Action String ID - &UpdateData // Container for dynamic created opcodes - ); - - // - // Prepare initial value for the dynamic created oneof Question - // - PrivateData->Configuration.DynamicOneof = 2; - Status = gRT->SetVariable( - VariableName, - &mFormSetGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - sizeof (DRIVER_SAMPLE_CONFIGURATION), - &PrivateData->Configuration - ); - CreateOneOfOpCode ( - 0x8001, // Question ID (or call it "key") - CONFIGURATION_VARSTORE_ID, // VarStore ID - DYNAMIC_ONE_OF_VAR_OFFSET, // Offset in Buffer Storage - STRING_TOKEN (STR_ONE_OF_PROMPT), // Question prompt text - STRING_TOKEN (STR_ONE_OF_HELP), // Question help text - EFI_IFR_FLAG_CALLBACK, // Question flag - EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value - IfrOptionList, // Option list - 2, // Number of options in Option list - &UpdateData // Container for dynamic created opcodes - ); - - CreateOrderedListOpCode ( - 0x8002, // Question ID - CONFIGURATION_VARSTORE_ID, // VarStore ID - DYNAMIC_ORDERED_LIST_VAR_OFFSET, // Offset in Buffer Storage - STRING_TOKEN (STR_BOOT_OPTIONS), // Question prompt text - STRING_TOKEN (STR_BOOT_OPTIONS), // Question help text - EFI_IFR_FLAG_RESET_REQUIRED, // Question flag - 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET - EFI_IFR_NUMERIC_SIZE_1, // Data type of Question value - 5, // Maximum container - IfrOptionList, // Option list - 2, // Number of options in Option list - &UpdateData // Container for dynamic created opcodes - ); - - CreateGotoOpCode ( - 1, // Target Form ID - STRING_TOKEN (STR_GOTO_FORM1), // Prompt text - STRING_TOKEN (STR_GOTO_HELP), // Help text - 0, // Question flag - 0x8003, // Question ID - &UpdateData // Container for dynamic created opcodes - ); - - Status = IfrLibUpdateForm ( - PrivateData->HiiHandle[0], // HII handle - &mFormSetGuid, // Formset GUID - 0x1234, // Form ID - 0x1234, // Label for where to insert opcodes - TRUE, // Append or replace - &UpdateData // Dynamic created opcodes - ); - gBS->FreePool (IfrOptionList); - IfrLibFreeUpdateData (&UpdateData); - break; - - case 0x5678: - // - // We will reach here once the Question is refreshed - // - IfrLibInitUpdateData (&UpdateData, 0x1000); - - IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION)); - ASSERT (IfrOptionList != NULL); - - CreateActionOpCode ( - 0x1237, // Question ID - STRING_TOKEN(STR_EXIT_TEXT), // Prompt text - STRING_TOKEN(STR_EXIT_TEXT), // Help text - EFI_IFR_FLAG_CALLBACK, // Question flag - 0, // Action String ID - &UpdateData // Container for dynamic created opcodes - ); - - Status = IfrLibUpdateForm ( - PrivateData->HiiHandle[0], // HII handle - &mFormSetGuid, // Formset GUID - 3, // Form ID - 0x2234, // Label for where to insert opcodes - TRUE, // Append or replace - &UpdateData // Dynamic created opcodes - ); - IfrLibFreeUpdateData (&UpdateData); + StartOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (StartOpCodeHandle != NULL); + + EndOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (EndOpCodeHandle != NULL); + + // + // Create Hii Extend Label OpCode as the start opcode + // + StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); + StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; + StartLabel->Number = LABEL_UPDATE1; + + // + // Create Hii Extend Label OpCode as the end opcode + // + EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); + EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; + EndLabel->Number = LABEL_END; + + HiiCreateActionOpCode ( + StartOpCodeHandle, // Container for dynamic created opcodes + 0x1237, // Question ID + STRING_TOKEN(STR_EXIT_TEXT), // Prompt text + STRING_TOKEN(STR_EXIT_TEXT), // Help text + EFI_IFR_FLAG_CALLBACK, // Question flag + 0 // Action String ID + ); + + // + // Create Option OpCode + // + OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (OptionsOpCodeHandle != NULL); + + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + STRING_TOKEN (STR_BOOT_OPTION1), + 0, + EFI_IFR_NUMERIC_SIZE_1, + 1 + ); + + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + STRING_TOKEN (STR_BOOT_OPTION2), + 0, + EFI_IFR_NUMERIC_SIZE_1, + 2 + ); + + // + // Prepare initial value for the dynamic created oneof Question + // + PrivateData->Configuration.DynamicOneof = 2; + Status = gRT->SetVariable( + VariableName, + &mFormSetGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof (DRIVER_SAMPLE_CONFIGURATION), + &PrivateData->Configuration + ); + + HiiCreateOneOfOpCode ( + StartOpCodeHandle, // Container for dynamic created opcodes + 0x8001, // Question ID (or call it "key") + CONFIGURATION_VARSTORE_ID, // VarStore ID + (UINT16) DYNAMIC_ONE_OF_VAR_OFFSET, // Offset in Buffer Storage + STRING_TOKEN (STR_ONE_OF_PROMPT), // Question prompt text + STRING_TOKEN (STR_ONE_OF_HELP), // Question help text + EFI_IFR_FLAG_CALLBACK, // Question flag + EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value + OptionsOpCodeHandle, // Option Opcode list + NULL // Default Opcode is NULl + ); + + HiiCreateOrderedListOpCode ( + StartOpCodeHandle, // Container for dynamic created opcodes + 0x8002, // Question ID + CONFIGURATION_VARSTORE_ID, // VarStore ID + (UINT16) DYNAMIC_ORDERED_LIST_VAR_OFFSET, // Offset in Buffer Storage + STRING_TOKEN (STR_BOOT_OPTIONS), // Question prompt text + STRING_TOKEN (STR_BOOT_OPTIONS), // Question help text + EFI_IFR_FLAG_RESET_REQUIRED, // Question flag + 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET + EFI_IFR_NUMERIC_SIZE_1, // Data type of Question value + 5, // Maximum container + OptionsOpCodeHandle, // Option Opcode list + NULL // Default Opcode is NULl + ); + + HiiCreateGotoOpCode ( + StartOpCodeHandle, // Container for dynamic created opcodes + 1, // Target Form ID + STRING_TOKEN (STR_GOTO_FORM1), // Prompt text + STRING_TOKEN (STR_GOTO_HELP), // Help text + 0, // Question flag + 0x8003 // Question ID + ); + + HiiUpdateForm ( + PrivateData->HiiHandle[0], // HII handle + &mFormSetGuid, // Formset GUID + 0x1234, // Form ID + StartOpCodeHandle, // Label for where to insert opcodes + EndOpCodeHandle // Replace data + ); + + HiiFreeOpCodeHandle (StartOpCodeHandle); + HiiFreeOpCodeHandle (OptionsOpCodeHandle); + break; - // - // Refresh the Question value - // - PrivateData->Configuration.DynamicRefresh++; - Status = gRT->SetVariable( - VariableName, - &mFormSetGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - sizeof (DRIVER_SAMPLE_CONFIGURATION), - &PrivateData->Configuration - ); + case 0x5678: + // + // We will reach here once the Question is refreshed + // + + // + // Initialize the container for dynamic opcodes + // + StartOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (StartOpCodeHandle != NULL); + + // + // Create Hii Extend Label OpCode as the start opcode + // + StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); + StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; + StartLabel->Number = LABEL_UPDATE2; + + HiiCreateActionOpCode ( + StartOpCodeHandle, // Container for dynamic created opcodes + 0x1237, // Question ID + STRING_TOKEN(STR_EXIT_TEXT), // Prompt text + STRING_TOKEN(STR_EXIT_TEXT), // Help text + EFI_IFR_FLAG_CALLBACK, // Question flag + 0 // Action String ID + ); - // - // Change an EFI Variable storage (MyEfiVar) asynchronous, this will cause - // the first statement in Form 3 be suppressed - // - MyVar = 111; - Status = gRT->SetVariable( - L"MyVar", - &mFormSetGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - 1, - &MyVar - ); + HiiUpdateForm ( + PrivateData->HiiHandle[0], // HII handle + &mFormSetGuid, // Formset GUID + 0x3, // Form ID + StartOpCodeHandle, // Label for where to insert opcodes + NULL // Insert data + ); + + HiiFreeOpCodeHandle (StartOpCodeHandle); + + // + // Refresh the Question value + // + PrivateData->Configuration.DynamicRefresh++; + Status = gRT->SetVariable( + VariableName, + &mFormSetGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof (DRIVER_SAMPLE_CONFIGURATION), + &PrivateData->Configuration + ); + + // + // Change an EFI Variable storage (MyEfiVar) asynchronous, this will cause + // the first statement in Form 3 be suppressed + // + MyVar = 111; + Status = gRT->SetVariable( + L"MyVar", + &mFormSetGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, + 1, + &MyVar + ); break; case 0x1237: @@ -689,11 +810,7 @@ DriverSampleInit ( ) { EFI_STATUS Status; - EFI_STATUS SavedStatus; - EFI_HII_PACKAGE_LIST_HEADER *PackageList; EFI_HII_HANDLE HiiHandle[2]; - EFI_HANDLE DriverHandle[2]; - DRIVER_SAMPLE_PRIVATE_DATA *PrivateData; EFI_SCREEN_DESCRIPTOR Screen; EFI_HII_DATABASE_PROTOCOL *HiiDatabase; EFI_HII_STRING_PROTOCOL *HiiString; @@ -702,11 +819,13 @@ DriverSampleInit ( CHAR16 *NewString; UINTN BufferSize; DRIVER_SAMPLE_CONFIGURATION *Configuration; - BOOLEAN ExtractIfrDefault; + BOOLEAN ActionFlag; + EFI_STRING ConfigRequestHdr; // - // Initialize the library and our protocol. + // Initialize the local variables. // + ConfigRequestHdr = NULL; // // Initialize screen dimensions for SendForm(). @@ -769,77 +888,58 @@ DriverSampleInit ( } PrivateData->HiiConfigRouting = HiiConfigRouting; - // - // Install Config Access protocol - // - Status = HiiLibCreateHiiDriverHandle (&DriverHandle[0]); - if (EFI_ERROR (Status)) { - return Status; - } - PrivateData->DriverHandle[0] = DriverHandle[0]; - - Status = gBS->InstallProtocolInterface ( + Status = gBS->InstallMultipleProtocolInterfaces ( &DriverHandle[0], + &gEfiDevicePathProtocolGuid, + &mHiiVendorDevicePath0, &gEfiHiiConfigAccessProtocolGuid, - EFI_NATIVE_INTERFACE, - &PrivateData->ConfigAccess + &PrivateData->ConfigAccess, + NULL ); ASSERT_EFI_ERROR (Status); + PrivateData->DriverHandle[0] = DriverHandle[0]; + // // Publish our HII data // - PackageList = HiiLibPreparePackageList ( - 2, - &mFormSetGuid, - DriverSampleStrings, - VfrBin - ); - if (PackageList == NULL) { + HiiHandle[0] = HiiAddPackages ( + &mFormSetGuid, + DriverHandle[0], + DriverSampleStrings, + VfrBin, + NULL + ); + if (HiiHandle[0] == NULL) { return EFI_OUT_OF_RESOURCES; } - Status = HiiDatabase->NewPackageList ( - HiiDatabase, - PackageList, - DriverHandle[0], - &HiiHandle[0] - ); - gBS->FreePool (PackageList); - if (EFI_ERROR (Status)) { - return Status; - } PrivateData->HiiHandle[0] = HiiHandle[0]; // // Publish another Fromset // - Status = HiiLibCreateHiiDriverHandle (&DriverHandle[1]); - if (EFI_ERROR (Status)) { - return Status; - } + Status = gBS->InstallMultipleProtocolInterfaces ( + &DriverHandle[1], + &gEfiDevicePathProtocolGuid, + &mHiiVendorDevicePath1, + NULL + ); + ASSERT_EFI_ERROR (Status); + PrivateData->DriverHandle[1] = DriverHandle[1]; - PackageList = HiiLibPreparePackageList ( - 2, - &mInventoryGuid, - DriverSampleStrings, - InventoryBin - ); - if (PackageList == NULL) { + HiiHandle[1] = HiiAddPackages ( + &mInventoryGuid, + DriverHandle[1], + DriverSampleStrings, + InventoryBin, + NULL + ); + if (HiiHandle[1] == NULL) { return EFI_OUT_OF_RESOURCES; } - Status = HiiDatabase->NewPackageList ( - HiiDatabase, - PackageList, - DriverHandle[1], - &HiiHandle[1] - ); - gBS->FreePool (PackageList); - if (EFI_ERROR (Status)) { - return Status; - } PrivateData->HiiHandle[1] = HiiHandle[1]; // @@ -848,9 +948,8 @@ DriverSampleInit ( // NewString = L"700 Mhz"; - Status = HiiLibSetString (HiiHandle[0], STRING_TOKEN (STR_CPU_STRING2), NewString); - if (EFI_ERROR (Status)) { - return Status; + if (HiiSetString (HiiHandle[0], STRING_TOKEN (STR_CPU_STRING2), NewString, NULL) == 0) { + return EFI_OUT_OF_RESOURCES; } // @@ -862,69 +961,104 @@ DriverSampleInit ( // // Try to read NV config EFI variable first // - ExtractIfrDefault = TRUE; + ConfigRequestHdr = HiiConstructConfigHdr (&mFormSetGuid, VariableName, DriverHandle[0]); + ASSERT (ConfigRequestHdr != NULL); + BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION); Status = gRT->GetVariable (VariableName, &mFormSetGuid, NULL, &BufferSize, Configuration); - if (!EFI_ERROR (Status) && (BufferSize == sizeof (DRIVER_SAMPLE_CONFIGURATION))) { - ExtractIfrDefault = FALSE; - } - - if (ExtractIfrDefault) { + if (EFI_ERROR (Status)) { // // EFI variable for NV config doesn't exit, we should build this variable // based on default values stored in IFR // - BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION); - Status = IfrLibExtractDefault (Configuration, &BufferSize, 1, VfrMyIfrNVDataDefault0000); - - if (!EFI_ERROR (Status)) { - gRT->SetVariable( - VariableName, - &mFormSetGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - sizeof (DRIVER_SAMPLE_CONFIGURATION), - Configuration - ); - } + ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD); + ASSERT (ActionFlag); + } else { + // + // EFI variable does exist and Validate Current Setting + // + ActionFlag = HiiValidateSettings (ConfigRequestHdr); + ASSERT (ActionFlag); } + + FreePool (ConfigRequestHdr); + + + // + // In default, this driver is built into Flash device image, + // the following code doesn't run. + // // // Example of how to display only the item we sent to HII + // When this driver is not built into Flash device image, + // it need to call SendForm to show front page by itself. // - if (DISPLAY_ONLY_MY_ITEM == 0x0001) { + if (DISPLAY_ONLY_MY_ITEM <= 1) { // // 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); - // Status = FormBrowser2->SendForm ( FormBrowser2, - HiiHandle, + &(HiiHandle[DISPLAY_ONLY_MY_ITEM]), 1, NULL, 0, NULL, NULL ); - SavedStatus = Status; + + HiiRemovePackages (HiiHandle[0]); + + HiiRemovePackages (HiiHandle[1]); + } - Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[0]); - if (EFI_ERROR (Status)) { - return Status; - } + return EFI_SUCCESS; +} - Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[1]); - if (EFI_ERROR (Status)) { - return Status; - } +/** + Unloads the application and its installed protocol. - return SavedStatus; - } 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); - // + @param[in] ImageHandle Handle that identifies the image to be unloaded. + + @retval EFI_SUCCESS The image has been unloaded. +**/ +EFI_STATUS +EFIAPI +DriverSampleUnload ( + IN EFI_HANDLE ImageHandle + ) +{ + if (DriverHandle[0] != NULL) { + gBS->UninstallMultipleProtocolInterfaces ( + DriverHandle[0], + &gEfiDevicePathProtocolGuid, + &mHiiVendorDevicePath0, + &gEfiHiiConfigAccessProtocolGuid, + &PrivateData->ConfigAccess, + NULL + ); + } + + if (DriverHandle[1] != NULL) { + gBS->UninstallMultipleProtocolInterfaces ( + DriverHandle[1], + &gEfiDevicePathProtocolGuid, + &mHiiVendorDevicePath1, + NULL + ); + } + + if (PrivateData->HiiHandle[0] != NULL) { + HiiRemovePackages (PrivateData->HiiHandle[0]); + } + + if (PrivateData->HiiHandle[1] != NULL) { + HiiRemovePackages (PrivateData->HiiHandle[1]); + } + + if (PrivateData != NULL) { + FreePool (PrivateData); } return EFI_SUCCESS;