X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FDriverSampleDxe%2FDriverSample.c;h=87ffac827903fe9312638c3b7ab64bb5744f1aa4;hb=84f9a9ec8f84f837b3c0addf1f4681d8f8c71db1;hp=9ef7c3bf836a26f09fbc7aa6aceb558137bad404;hpb=7e3bcccb0eed449e95c18b01ae8cbace1a759d01;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c index 9ef7c3bf83..87ffac8279 100644 --- a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c +++ b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c @@ -128,6 +128,7 @@ ValidatePassword ( EFI_STATUS Status; UINTN Index; UINTN BufferSize; + UINTN PasswordMaxSize; CHAR16 *Password; CHAR16 *EncodedPassword; BOOLEAN OldPassword; @@ -151,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; @@ -170,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)) { + Password = HiiGetString (PrivateData->HiiHandle[0], StringId, NULL); + if (Password == NULL) { + return EFI_NOT_READY; + } + if (StrSize (Password) > PasswordMaxSize) { FreePool (Password); - return Status; + 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 // @@ -219,6 +221,7 @@ SetPassword ( { EFI_STATUS Status; CHAR16 *Password; + CHAR16 *TempPassword; UINTN PasswordSize; DRIVER_SAMPLE_CONFIGURATION *Configuration; UINTN BufferSize; @@ -242,23 +245,30 @@ SetPassword ( // Get user input password // Password = &PrivateData->Configuration.WhatIsThePassword2[0]; - PasswordSize = sizeof (PrivateData->Configuration.WhatIsThePassword2); - + PasswordSize = sizeof (PrivateData->Configuration.WhatIsThePassword2); ZeroMem (Password, PasswordSize); - Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize); - if (EFI_ERROR (Status)) { - return Status; + + 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 // - Configuration = (DRIVER_SAMPLE_CONFIGURATION *) HiiGetBrowserData (&mFormSetGuid, VariableName, sizeof (DRIVER_SAMPLE_CONFIGURATION)); - if (Configuration != NULL) { + Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_CONFIGURATION)); + ASSERT (Configuration != NULL); + if (HiiGetBrowserData (&mFormSetGuid, VariableName, sizeof (DRIVER_SAMPLE_CONFIGURATION), (UINT8 *) Configuration)) { // // Update password's clear text in the screen // - CopyMem (Configuration->PasswordClearText, Password, PasswordSize); + CopyMem (Configuration->PasswordClearText, Password, StrSize (Password)); // // Update uncommitted data of Browser @@ -270,15 +280,18 @@ SetPassword ( (UINT8 *) Configuration, NULL ); - - FreePool (Configuration); } + // + // Free Configuration Buffer + // + FreePool (Configuration); + // // Set password // - EncodePassword (Password, PasswordSize); + EncodePassword (Password, StrLen (Password) * 2); Status = gRT->SetVariable( VariableName, &mFormSetGuid, @@ -329,61 +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 + // Request is set to NULL, construct full request string. // - *Results = HiiConstructConfigAltResp ( - &mFormSetGuid, - VariableName, - PrivateData->DriverHandle[0], - &PrivateData->Configuration, - BufferSize, - VfrMyIfrNVDataBlockName, - STRING_TOKEN (STR_STANDARD_DEFAULT_PROMPT), - VfrMyIfrNVDataDefault0000, - STRING_TOKEN (STR_MANUFACTURE_DEFAULT_PROMPT), - VfrMyIfrNVDataDefault0001, - 0, - NULL - ); - + // - // No matched storage is found. + // First Set ConfigRequestHdr string. // - if (*Results == NULL) { - return EFI_NOT_FOUND; - } + ConfigRequestHdr = HiiConstructConfigHdr (&mFormSetGuid, VariableName, PrivateData->DriverHandle[0]); + ASSERT (ConfigRequestHdr != NULL); - return EFI_SUCCESS; + // + // 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 (!HiiIsConfigHdrMatch (Request, &mFormSetGuid, VariableName)) { - *Progress = Request; + if (!HiiIsConfigHdrMatch (ConfigRequest, &mFormSetGuid, VariableName)) { + if (Request == NULL) { + FreePool (ConfigRequest); + } return EFI_NOT_FOUND; } @@ -392,12 +409,17 @@ ExtractConfig ( // Status = HiiConfigRouting->BlockToConfig ( HiiConfigRouting, - Request, + ConfigRequest, (UINT8 *) &PrivateData->Configuration, BufferSize, Results, Progress ); + + if (Request == NULL) { + FreePool (ConfigRequest); + } + return Status; } @@ -440,6 +462,7 @@ 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. // @@ -452,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() @@ -538,6 +558,11 @@ DriverCallback ( 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); @@ -785,8 +810,6 @@ DriverSampleInit ( ) { EFI_STATUS Status; - EFI_STATUS SavedStatus; - EFI_HII_PACKAGE_LIST_HEADER *PackageList; EFI_HII_HANDLE HiiHandle[2]; EFI_SCREEN_DESCRIPTOR Screen; EFI_HII_DATABASE_PROTOCOL *HiiDatabase; @@ -796,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(). @@ -878,26 +903,17 @@ DriverSampleInit ( // // 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] - ); - FreePool (PackageList); - if (EFI_ERROR (Status)) { - return Status; - } PrivateData->HiiHandle[0] = HiiHandle[0]; // @@ -913,26 +929,17 @@ DriverSampleInit ( 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] - ); - FreePool (PackageList); - if (EFI_ERROR (Status)) { - return Status; - } PrivateData->HiiHandle[1] = HiiHandle[1]; // @@ -941,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; } // @@ -955,36 +961,31 @@ 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); } - SavedStatus = EFI_SUCCESS; + FreePool (ConfigRequestHdr); + // - // Default this driver is built into Flash device image, + // In default, this driver is built into Flash device image, // the following code doesn't run. // @@ -1006,20 +1007,13 @@ DriverSampleInit ( NULL, NULL ); - SavedStatus = Status; - Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[0]); - if (EFI_ERROR (Status)) { - return Status; - } + HiiRemovePackages (HiiHandle[0]); - Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[1]); - if (EFI_ERROR (Status)) { - return Status; - } + HiiRemovePackages (HiiHandle[1]); } - return SavedStatus; + return EFI_SUCCESS; } /** @@ -1055,6 +1049,14 @@ DriverSampleUnload ( ); } + if (PrivateData->HiiHandle[0] != NULL) { + HiiRemovePackages (PrivateData->HiiHandle[0]); + } + + if (PrivateData->HiiHandle[1] != NULL) { + HiiRemovePackages (PrivateData->HiiHandle[1]); + } + if (PrivateData != NULL) { FreePool (PrivateData); }