BDS code calls Hii->FindHandles() with hardcoded length.
authorxli24 <xli24@de2fecce-e211-0410-80a6-f3fac2684e05>
Thu, 11 Jan 2007 06:37:39 +0000 (06:37 +0000)
committerxli24 <xli24@de2fecce-e211-0410-80a6-f3fac2684e05>
Thu, 11 Jan 2007 06:37:39 +0000 (06:37 +0000)
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.tianocore.org/svn/edk2/trunk@2216 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/EdkNt32Pkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c
edk2/EdkNt32Pkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c
edk2/EdkNt32Pkg/Dxe/PlatformBds/Generic/FrontPage.c
edk2/EdkNt32Pkg/Include/Library/EdkGenericBdsLib.h
edk2/EdkNt32Pkg/Library/EdkGenericBdsLib/BdsMisc.c
edk2/EdkUnixPkg/Dxe/PlatformBds/Generic/BootMaint/BmLib.c
edk2/EdkUnixPkg/Dxe/PlatformBds/Generic/DeviceMngr/DeviceManager.c
edk2/EdkUnixPkg/Dxe/PlatformBds/Generic/FrontPage.c
edk2/EdkUnixPkg/Include/Library/EdkGenericBdsLib.h
edk2/EdkUnixPkg/Library/EdkGenericBdsLib/BdsMisc.c

index 6f46386..b4f6d48 100644 (file)
@@ -464,8 +464,12 @@ Returns:
   EFI_GUID          HiiGuid;\r
   EFI_HII_PROTOCOL  *Hii;\r
 \r
-  HandleBufferLength  = 0x1000;\r
+  //\r
+  // Initialize params.\r
+  //\r
+  HandleBufferLength  = 0;\r
   HiiHandleBuffer     = NULL;\r
+  \r
   Status = gBS->LocateProtocol (\r
                   &gEfiHiiProtocolGuid,\r
                   NULL,\r
@@ -478,12 +482,9 @@ Returns:
   //\r
   // Get all the Hii handles\r
   //\r
-  HiiHandleBuffer = AllocateZeroPool (HandleBufferLength);\r
-  ASSERT (HiiHandleBuffer != NULL);\r
-\r
-  Status = Hii->FindHandles (Hii, &HandleBufferLength, HiiHandleBuffer);\r
+  Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer);\r
   ASSERT_EFI_ERROR (Status);\r
-\r
+  \r
   //\r
   // Get the Hii Handle that matches the StructureNode->ProducerName\r
   //\r
index c186fee..2da9c6f 100644 (file)
@@ -201,6 +201,7 @@ Returns:
 \r
   IfrOptionList       = NULL;\r
   VideoOption         = NULL;\r
+  HiiHandles          = NULL;\r
   HandleBufferLength  = 0;\r
 \r
   //\r
@@ -268,8 +269,11 @@ Returns:
   CreateSubTitleOpCode (STR_EMPTY_STRING, &UpdateData->Data);\r
   Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) Count, TRUE, UpdateData);\r
 \r
-  HiiHandles = AllocateZeroPool (HandleBufferLength);\r
-  Hii->FindHandles (Hii, &HandleBufferLength, HiiHandles);\r
+  //\r
+  // Get all the Hii handles\r
+  //\r
+  Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandles);\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   for (Index = 1, BufferSize = 0; Index < HandleBufferLength; Index++) {\r
     //\r
@@ -487,6 +491,7 @@ Returns:
   }\r
 \r
   gBS->FreePool (UpdateData);\r
+  gBS->FreePool (HiiHandles);\r
 \r
   return Status;\r
 }\r
index a31e8a9..c659384 100644 (file)
@@ -485,15 +485,16 @@ Returns:
   UINT16          Length;\r
   EFI_GUID        HiiGuid;\r
 \r
-  HandleBufferLength  = 0x1000;\r
+  //\r
+  // Initialize params.\r
+  //\r
+  HandleBufferLength  = 0;\r
   HiiHandleBuffer     = NULL;\r
 \r
   //\r
   // Get all the Hii handles\r
   //\r
-  HiiHandleBuffer = AllocateZeroPool (HandleBufferLength);\r
-\r
-  Status          = Hii->FindHandles (Hii, &HandleBufferLength, HiiHandleBuffer);\r
+  Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
index 9abda55..ed52085 100644 (file)
@@ -379,4 +379,11 @@ SetupResetReminder (
   VOID\r
   );\r
   \r
+EFI_STATUS\r
+BdsLibGetHiiHandles (\r
+  IN     EFI_HII_PROTOCOL *Hii,\r
+  IN OUT UINT16           *HandleBufferLength,\r
+  OUT    EFI_HII_HANDLE   **HiiHandles\r
+  );\r
+\r
 #endif // _BDS_LIB_H_\r
index b88d051..908bc30 100644 (file)
@@ -975,3 +975,56 @@ Returns:
     } \r
   } \r
 } \r
+\r
+EFI_STATUS\r
+BdsLibGetHiiHandles (\r
+  IN     EFI_HII_PROTOCOL *Hii,\r
+  IN OUT UINT16           *HandleBufferLength,\r
+  OUT    EFI_HII_HANDLE   **HiiHandleBuffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Determines the handles that are currently active in the database.\r
+  It's the caller's responsibility to free handle buffer.\r
+\r
+Arguments:\r
+\r
+  This                  - A pointer to the EFI_HII_PROTOCOL instance.\r
+  HandleBufferLength    - On input, a pointer to the length of the handle buffer. On output, \r
+                          the length of the handle buffer that is required for the handles found.\r
+  HiiHandleBuffer       - Pointer to an array of EFI_HII_PROTOCOL instances returned.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - Get an array of EFI_HII_PROTOCOL instances successfully.\r
+  EFI_INVALID_PARAMETER - Hii is NULL.\r
+  EFI_NOT_FOUND         - Database not found.\r
+  \r
+--*/\r
+{\r
+  UINT16      TempBufferLength;\r
+  EFI_STATUS  Status;\r
+  \r
+  TempBufferLength = 0;\r
+  \r
+  //\r
+  // Try to find the actual buffer size for HiiHandle Buffer.\r
+  //\r
+  Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer);\r
+  \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    *HiiHandleBuffer = AllocateZeroPool (TempBufferLength);\r
+    Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer);\r
+    //\r
+    // we should not fail here.\r
+    //\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+  \r
+  *HandleBufferLength = TempBufferLength;\r
+  \r
+  return Status;\r
+  \r
+}\r
index 415321e..e9245d2 100644 (file)
@@ -464,8 +464,12 @@ Returns:
   EFI_GUID          HiiGuid;\r
   EFI_HII_PROTOCOL  *Hii;\r
 \r
-  HandleBufferLength  = 0x1000;\r
+  //\r
+  // Initialize params.\r
+  //\r
+  HandleBufferLength  = 0;\r
   HiiHandleBuffer     = NULL;\r
+  \r
   Status = gBS->LocateProtocol (\r
                   &gEfiHiiProtocolGuid,\r
                   NULL,\r
@@ -478,12 +482,9 @@ Returns:
   //\r
   // Get all the Hii handles\r
   //\r
-  HiiHandleBuffer = AllocateZeroPool (HandleBufferLength);\r
-  ASSERT (HiiHandleBuffer != NULL);\r
-\r
-  Status = Hii->FindHandles (Hii, &HandleBufferLength, HiiHandleBuffer);\r
+  Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer);\r
   ASSERT_EFI_ERROR (Status);\r
-\r
+  \r
   //\r
   // Get the Hii Handle that matches the StructureNode->ProducerName\r
   //\r
index 3f648b7..02be71e 100644 (file)
@@ -201,6 +201,7 @@ Returns:
 \r
   IfrOptionList       = NULL;\r
   VideoOption         = NULL;\r
+  HiiHandles          = NULL;\r
   HandleBufferLength  = 0;\r
 \r
   //\r
@@ -268,8 +269,11 @@ Returns:
   CreateSubTitleOpCode (STR_EMPTY_STRING, &UpdateData->Data);\r
   Hii->UpdateForm (Hii, FPCallbackInfo.DevMgrHiiHandle, (EFI_FORM_LABEL) Count, TRUE, UpdateData);\r
 \r
-  HiiHandles = AllocateZeroPool (HandleBufferLength);\r
-  Hii->FindHandles (Hii, &HandleBufferLength, HiiHandles);\r
+  //\r
+  // Get all the Hii handles\r
+  //\r
+  Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandles);\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   for (Index = 1, BufferSize = 0; Index < HandleBufferLength; Index++) {\r
     //\r
@@ -487,6 +491,7 @@ Returns:
   }\r
 \r
   gBS->FreePool (UpdateData);\r
+  gBS->FreePool (HiiHandles);\r
 \r
   return Status;\r
 }\r
index 6a3a34e..56292f9 100644 (file)
@@ -485,15 +485,16 @@ Returns:
   UINT16          Length;\r
   EFI_GUID        HiiGuid;\r
 \r
-  HandleBufferLength  = 0x1000;\r
+  //\r
+  // Initialize params.\r
+  //\r
+  HandleBufferLength  = 0;\r
   HiiHandleBuffer     = NULL;\r
 \r
   //\r
   // Get all the Hii handles\r
   //\r
-  HiiHandleBuffer = AllocateZeroPool (HandleBufferLength);\r
-\r
-  Status          = Hii->FindHandles (Hii, &HandleBufferLength, HiiHandleBuffer);\r
+  Status = BdsLibGetHiiHandles (Hii, &HandleBufferLength, &HiiHandleBuffer);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
index 9abda55..ed52085 100644 (file)
@@ -379,4 +379,11 @@ SetupResetReminder (
   VOID\r
   );\r
   \r
+EFI_STATUS\r
+BdsLibGetHiiHandles (\r
+  IN     EFI_HII_PROTOCOL *Hii,\r
+  IN OUT UINT16           *HandleBufferLength,\r
+  OUT    EFI_HII_HANDLE   **HiiHandles\r
+  );\r
+\r
 #endif // _BDS_LIB_H_\r
index 659bdc6..6b4d1aa 100644 (file)
@@ -976,3 +976,56 @@ Returns:
     } \r
   } \r
 } \r
+\r
+EFI_STATUS\r
+BdsLibGetHiiHandles (\r
+  IN     EFI_HII_PROTOCOL *Hii,\r
+  IN OUT UINT16           *HandleBufferLength,\r
+  OUT    EFI_HII_HANDLE   **HiiHandleBuffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Determines the handles that are currently active in the database.\r
+  It's the caller's responsibility to free handle buffer.\r
+\r
+Arguments:\r
+\r
+  This                  - A pointer to the EFI_HII_PROTOCOL instance.\r
+  HandleBufferLength    - On input, a pointer to the length of the handle buffer. On output, \r
+                          the length of the handle buffer that is required for the handles found.\r
+  HiiHandleBuffer       - Pointer to an array of EFI_HII_PROTOCOL instances returned.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - Get an array of EFI_HII_PROTOCOL instances successfully.\r
+  EFI_INVALID_PARAMETER - Hii is NULL.\r
+  EFI_NOT_FOUND         - Database not found.\r
+  \r
+--*/\r
+{\r
+  UINT16      TempBufferLength;\r
+  EFI_STATUS  Status;\r
+  \r
+  TempBufferLength = 0;\r
+  \r
+  //\r
+  // Try to find the actual buffer size for HiiHandle Buffer.\r
+  //\r
+  Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer);\r
+  \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    *HiiHandleBuffer = AllocateZeroPool (TempBufferLength);\r
+    Status = Hii->FindHandles (Hii, &TempBufferLength, *HiiHandleBuffer);\r
+    //\r
+    // we should not fail here.\r
+    //\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+  \r
+  *HandleBufferLength = TempBufferLength;\r
+  \r
+  return Status;\r
+  \r
+}\r