diff --git a/EdkNt32Pkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c b/EdkNt32Pkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c index 6f46386621..b4f6d481ce 100644 --- a/EdkNt32Pkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c +++ b/EdkNt32Pkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c @@ -464,8 +464,12 @@ Returns: EFI_GUID HiiGuid; EFI_HII_PROTOCOL *Hii; - HandleBufferLength = 0x1000; + // + // Initialize params. + // + HandleBufferLength = 0; HiiHandleBuffer = NULL; + Status = gBS->LocateProtocol ( &gEfiHiiProtocolGuid, NULL, @@ -478,12 +482,9 @@ Returns: // // Get all the Hii handles // - HiiHandleBuffer = AllocateZeroPool (HandleBufferLength); - ASSERT (HiiHandleBuffer != NULL); - - Status = Hii->FindHandles (Hii, &HandleBufferLength, HiiHandleBuffer); + Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer); ASSERT_EFI_ERROR (Status); - + // // Get the Hii Handle that matches the StructureNode->ProducerName // diff --git a/EdkNt32Pkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c b/EdkNt32Pkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c index c186fee9a3..2da9c6fa36 100644 --- a/EdkNt32Pkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c +++ b/EdkNt32Pkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c @@ -201,6 +201,7 @@ Returns: IfrOptionList = NULL; VideoOption = NULL; + HiiHandles = NULL; HandleBufferLength = 0; // @@ -268,8 +269,11 @@ Returns: CreateSubTitleOpCode (STR_EMPTY_STRING, &UpdateData->Data); Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) Count, TRUE, UpdateData); - HiiHandles = AllocateZeroPool (HandleBufferLength); - Hii->FindHandles (Hii, &HandleBufferLength, HiiHandles); + // + // Get all the Hii handles + // + Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandles); + ASSERT_EFI_ERROR (Status); for (Index = 1, BufferSize = 0; Index < HandleBufferLength; Index++) { // @@ -487,6 +491,7 @@ Returns: } gBS->FreePool (UpdateData); + gBS->FreePool (HiiHandles); return Status; } diff --git a/EdkNt32Pkg/Dxe/PlatformBds/Generic/FrontPage.c b/EdkNt32Pkg/Dxe/PlatformBds/Generic/FrontPage.c index a31e8a9570..c659384d4d 100644 --- a/EdkNt32Pkg/Dxe/PlatformBds/Generic/FrontPage.c +++ b/EdkNt32Pkg/Dxe/PlatformBds/Generic/FrontPage.c @@ -485,15 +485,16 @@ Returns: UINT16 Length; EFI_GUID HiiGuid; - HandleBufferLength = 0x1000; + // + // Initialize params. + // + HandleBufferLength = 0; HiiHandleBuffer = NULL; // // Get all the Hii handles // - HiiHandleBuffer = AllocateZeroPool (HandleBufferLength); - - Status = Hii->FindHandles (Hii, &HandleBufferLength, HiiHandleBuffer); + Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer); ASSERT_EFI_ERROR (Status); // diff --git a/EdkNt32Pkg/Include/Library/EdkGenericBdsLib.h b/EdkNt32Pkg/Include/Library/EdkGenericBdsLib.h index 9abda55891..ed52085a17 100644 --- a/EdkNt32Pkg/Include/Library/EdkGenericBdsLib.h +++ b/EdkNt32Pkg/Include/Library/EdkGenericBdsLib.h @@ -379,4 +379,11 @@ SetupResetReminder ( VOID ); +EFI_STATUS +BdsLibGetHiiHandles ( + IN EFI_HII_PROTOCOL *Hii, + IN OUT UINT16 *HandleBufferLength, + OUT EFI_HII_HANDLE **HiiHandles + ); + #endif // _BDS_LIB_H_ diff --git a/EdkNt32Pkg/Library/EdkGenericBdsLib/BdsMisc.c b/EdkNt32Pkg/Library/EdkGenericBdsLib/BdsMisc.c index b88d05127a..908bc3059b 100644 --- a/EdkNt32Pkg/Library/EdkGenericBdsLib/BdsMisc.c +++ b/EdkNt32Pkg/Library/EdkGenericBdsLib/BdsMisc.c @@ -975,3 +975,56 @@ Returns: } } } + +EFI_STATUS +BdsLibGetHiiHandles ( + IN EFI_HII_PROTOCOL *Hii, + IN OUT UINT16 *HandleBufferLength, + OUT EFI_HII_HANDLE **HiiHandleBuffer + ) +/*++ + +Routine Description: + + Determines the handles that are currently active in the database. + It's the caller's responsibility to free handle buffer. + +Arguments: + + This - A pointer to the EFI_HII_PROTOCOL instance. + HandleBufferLength - On input, a pointer to the length of the handle buffer. On output, + the length of the handle buffer that is required for the handles found. + HiiHandleBuffer - Pointer to an array of EFI_HII_PROTOCOL instances returned. + +Returns: + + EFI_SUCCESS - Get an array of EFI_HII_PROTOCOL instances successfully. + EFI_INVALID_PARAMETER - Hii is NULL. + EFI_NOT_FOUND - Database not found. + +--*/ +{ + UINT16 TempBufferLength; + EFI_STATUS Status; + + TempBufferLength = 0; + + // + // Try to find the actual buffer size for HiiHandle Buffer. + // + Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer); + + if (Status == EFI_BUFFER_TOO_SMALL) { + *HiiHandleBuffer = AllocateZeroPool (TempBufferLength); + Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer); + // + // we should not fail here. + // + ASSERT_EFI_ERROR (Status); + } + + *HandleBufferLength = TempBufferLength; + + return Status; + +} diff --git a/EdkUnixPkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c b/EdkUnixPkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c index 415321efd7..e9245d2fb6 100644 --- a/EdkUnixPkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c +++ b/EdkUnixPkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c @@ -464,8 +464,12 @@ Returns: EFI_GUID HiiGuid; EFI_HII_PROTOCOL *Hii; - HandleBufferLength = 0x1000; + // + // Initialize params. + // + HandleBufferLength = 0; HiiHandleBuffer = NULL; + Status = gBS->LocateProtocol ( &gEfiHiiProtocolGuid, NULL, @@ -478,12 +482,9 @@ Returns: // // Get all the Hii handles // - HiiHandleBuffer = AllocateZeroPool (HandleBufferLength); - ASSERT (HiiHandleBuffer != NULL); - - Status = Hii->FindHandles (Hii, &HandleBufferLength, HiiHandleBuffer); + Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer); ASSERT_EFI_ERROR (Status); - + // // Get the Hii Handle that matches the StructureNode->ProducerName // diff --git a/EdkUnixPkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c b/EdkUnixPkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c index 3f648b7de6..02be71e789 100644 --- a/EdkUnixPkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c +++ b/EdkUnixPkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c @@ -201,6 +201,7 @@ Returns: IfrOptionList = NULL; VideoOption = NULL; + HiiHandles = NULL; HandleBufferLength = 0; // @@ -268,8 +269,11 @@ Returns: CreateSubTitleOpCode (STR_EMPTY_STRING, &UpdateData->Data); Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) Count, TRUE, UpdateData); - HiiHandles = AllocateZeroPool (HandleBufferLength); - Hii->FindHandles (Hii, &HandleBufferLength, HiiHandles); + // + // Get all the Hii handles + // + Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandles); + ASSERT_EFI_ERROR (Status); for (Index = 1, BufferSize = 0; Index < HandleBufferLength; Index++) { // @@ -487,6 +491,7 @@ Returns: } gBS->FreePool (UpdateData); + gBS->FreePool (HiiHandles); return Status; } diff --git a/EdkUnixPkg/Dxe/PlatformBds/Generic/FrontPage.c b/EdkUnixPkg/Dxe/PlatformBds/Generic/FrontPage.c index 6a3a34e2c9..56292f9e47 100644 --- a/EdkUnixPkg/Dxe/PlatformBds/Generic/FrontPage.c +++ b/EdkUnixPkg/Dxe/PlatformBds/Generic/FrontPage.c @@ -485,15 +485,16 @@ Returns: UINT16 Length; EFI_GUID HiiGuid; - HandleBufferLength = 0x1000; + // + // Initialize params. + // + HandleBufferLength = 0; HiiHandleBuffer = NULL; // // Get all the Hii handles // - HiiHandleBuffer = AllocateZeroPool (HandleBufferLength); - - Status = Hii->FindHandles (Hii, &HandleBufferLength, HiiHandleBuffer); + Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer); ASSERT_EFI_ERROR (Status); // diff --git a/EdkUnixPkg/Include/Library/EdkGenericBdsLib.h b/EdkUnixPkg/Include/Library/EdkGenericBdsLib.h index 9abda55891..ed52085a17 100644 --- a/EdkUnixPkg/Include/Library/EdkGenericBdsLib.h +++ b/EdkUnixPkg/Include/Library/EdkGenericBdsLib.h @@ -379,4 +379,11 @@ SetupResetReminder ( VOID ); +EFI_STATUS +BdsLibGetHiiHandles ( + IN EFI_HII_PROTOCOL *Hii, + IN OUT UINT16 *HandleBufferLength, + OUT EFI_HII_HANDLE **HiiHandles + ); + #endif // _BDS_LIB_H_ diff --git a/EdkUnixPkg/Library/EdkGenericBdsLib/BdsMisc.c b/EdkUnixPkg/Library/EdkGenericBdsLib/BdsMisc.c index 659bdc666d..6b4d1aa149 100644 --- a/EdkUnixPkg/Library/EdkGenericBdsLib/BdsMisc.c +++ b/EdkUnixPkg/Library/EdkGenericBdsLib/BdsMisc.c @@ -976,3 +976,56 @@ Returns: } } } + +EFI_STATUS +BdsLibGetHiiHandles ( + IN EFI_HII_PROTOCOL *Hii, + IN OUT UINT16 *HandleBufferLength, + OUT EFI_HII_HANDLE **HiiHandleBuffer + ) +/*++ + +Routine Description: + + Determines the handles that are currently active in the database. + It's the caller's responsibility to free handle buffer. + +Arguments: + + This - A pointer to the EFI_HII_PROTOCOL instance. + HandleBufferLength - On input, a pointer to the length of the handle buffer. On output, + the length of the handle buffer that is required for the handles found. + HiiHandleBuffer - Pointer to an array of EFI_HII_PROTOCOL instances returned. + +Returns: + + EFI_SUCCESS - Get an array of EFI_HII_PROTOCOL instances successfully. + EFI_INVALID_PARAMETER - Hii is NULL. + EFI_NOT_FOUND - Database not found. + +--*/ +{ + UINT16 TempBufferLength; + EFI_STATUS Status; + + TempBufferLength = 0; + + // + // Try to find the actual buffer size for HiiHandle Buffer. + // + Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer); + + if (Status == EFI_BUFFER_TOO_SMALL) { + *HiiHandleBuffer = AllocateZeroPool (TempBufferLength); + Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer); + // + // we should not fail here. + // + ASSERT_EFI_ERROR (Status); + } + + *HandleBufferLength = TempBufferLength; + + return Status; + +}