diff options
author | xli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524> | 2007-01-11 06:37:39 +0000 |
---|---|---|
committer | xli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524> | 2007-01-11 06:37:39 +0000 |
commit | 0e7bfce8d0dc29695d0eb141f16e7976abcc5486 (patch) | |
tree | 95fe6aa7b9b40994b538b451f0c3a4fe16d0a6b4 | |
parent | c271c1326b7aacf837a75407233da97d6caada34 (diff) | |
download | edk2-platforms-0e7bfce8d0dc29695d0eb141f16e7976abcc5486.tar.xz |
BDS code calls Hii->FindHandles() with hardcoded length.
New code provides function BdsLibGetHiiHandles() in generic BDS library, which detects actual necessary memory, allocates memory, and finds handles as output.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2216 6f19259b-4bc3-4df7-8a09-765794883524
10 files changed, 158 insertions, 24 deletions
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;
+
+}
|