]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BDS code calls Hii->FindHandles() with hardcoded length.
authorxli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 11 Jan 2007 06:37:39 +0000 (06:37 +0000)
committerxli24 <xli24@6f19259b-4bc3-4df7-8a09-765794883524>
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.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2216 6f19259b-4bc3-4df7-8a09-765794883524

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

index 6f4638662166002f970db497091ca93d714f3c35..b4f6d481ce1a025903a4c2cdfc3a8df1b9b0e087 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 c186fee9a39e12685b2156ffb86e00bb26246134..2da9c6fa369b6a6cc097218499148854be13ca01 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 a31e8a9570647577f5bfd48c1abb286d31fee4e1..c659384d4d487e6a0d261069a3a8784fba7aca6f 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 9abda558913d8c4cccfb7a61df438b2a1bb5c1d6..ed52085a176d4256af334501938094e13580c2c0 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 b88d05127a41870a55cdd6852897a3dc7f9d6dfb..908bc3059be25fccb14dd691307ecf53cbb071d3 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 415321efd7898156222753683c952dd71fd6d07f..e9245d2fb62a38af9d4c43a749bca320546d610f 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 3f648b7de6d43eb979b706cd3591758fdb51485b..02be71e789ed847a31ce2e784a7cc9ffad4cebc6 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 6a3a34e2c960ba2e2d921df2a78180f5a1a4b6fe..56292f9e4793749becd70e89fbc53e60638ac3c0 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 9abda558913d8c4cccfb7a61df438b2a1bb5c1d6..ed52085a176d4256af334501938094e13580c2c0 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 659bdc666d97babd15d0ebea59f6c3fc14c645b0..6b4d1aa149a4a712ca8e3821a8f89c2732fd0ad9 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