]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/HiiLib/HiiLib.c
Code Clean up for IfrSupportLib, HiiLib, PeiExtractGuidedSectionLib and DxeExtractGui...
[mirror_edk2.git] / MdePkg / Library / HiiLib / HiiLib.c
CommitLineData
dd51a993 1/** @file\r
2 HII Library implementation that uses DXE protocols and services.\r
3\r
b911d09f 4 Copyright (c) 2006 - 2008, Intel Corporation<BR>\r
bad46384 5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
dd51a993 9\r
bad46384 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
dd51a993 12\r
dd51a993 13**/\r
14\r
7d582d6b 15#include "InternalHiiLib.h"\r
16\r
b911d09f
LG
17CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabaseProt = NULL;\r
18CONST EFI_HII_STRING_PROTOCOL *mHiiStringProt = NULL;\r
7d582d6b 19\r
e52c5a9f 20/**\r
7d582d6b 21\r
54cf8780 22 This function locate Hii relative protocols for later usage.\r
23\r
e52c5a9f 24**/\r
54cf8780 25VOID\r
26LocateHiiProtocols (\r
27 VOID\r
7d582d6b 28 )\r
29{\r
54cf8780 30 EFI_STATUS Status;\r
31\r
b911d09f 32 if (mHiiStringProt != NULL && mHiiDatabaseProt != NULL) {\r
29870c8d 33 //\r
34 // Only need to initialize the protocol instance once.\r
35 //\r
54cf8780 36 return;\r
37 }\r
38\r
39 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &mHiiDatabaseProt);\r
7d582d6b 40 ASSERT_EFI_ERROR (Status);\r
7d582d6b 41\r
54cf8780 42 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &mHiiStringProt);\r
7d582d6b 43 ASSERT_EFI_ERROR (Status);\r
7d582d6b 44}\r
45\r
7d582d6b 46\r
47\r
ad1b3619 48/**\r
49 This funciton build the package list based on the package number,\r
50 the GUID of the package list and the list of pointer which point to\r
51 package header that defined by UEFI VFR compiler and StringGather\r
52 tool.\r
53\r
29870c8d 54 #pragma pack (push, 1)\r
55 typedef struct {\r
56 UINT32 BinaryLength;\r
57 EFI_HII_PACKAGE_HEADER PackageHeader;\r
58 } TIANO_AUTOGEN_PACKAGES_HEADER;\r
59 #pragma pack (pop)\r
60\r
ad1b3619 61 If there is not enough resource for the new package list,\r
62 the function will ASSERT.\r
63\r
64 @param NumberOfPackages The number of packages be \r
65 @param GuidId The GUID for the package list to be generated.\r
66 @param Marker The variable argument list. Each entry represent a specific package header that is\r
67 generated by VFR compiler and StrGather tool. The first 4 bytes is a UINT32 value\r
68 that indicate the overall length of the package.\r
69\r
70 @return The pointer to the package list header.\r
71\r
72**/\r
7d582d6b 73EFI_HII_PACKAGE_LIST_HEADER *\r
74InternalHiiLibPreparePackages (\r
75 IN UINTN NumberOfPackages,\r
ad1b3619 76 IN CONST EFI_GUID *GuidId,\r
1db1f6ad 77 IN VA_LIST Marker\r
7d582d6b 78 )\r
79{\r
80 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
81 UINT8 *PackageListData;\r
82 UINT32 PackageListLength;\r
83 UINT32 PackageLength;\r
84 EFI_HII_PACKAGE_HEADER PackageHeader;\r
85 UINT8 *PackageArray;\r
86 UINTN Index;\r
87 VA_LIST MarkerBackup;\r
88\r
89 PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
90\r
91 MarkerBackup = Marker;\r
ccac388d 92\r
93 //\r
94 // Count the lenth of the final package list.\r
95 //\r
7d582d6b 96 for (Index = 0; Index < NumberOfPackages; Index++) {\r
97 CopyMem (&PackageLength, VA_ARG (Marker, VOID *), sizeof (UINT32));\r
29870c8d 98 //\r
99 // Do not count the BinaryLength field.\r
100 //\r
7d582d6b 101 PackageListLength += (PackageLength - sizeof (UINT32));\r
102 }\r
103\r
104 //\r
105 // Include the lenght of EFI_HII_PACKAGE_END\r
106 //\r
107 PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER);\r
108 PackageListHeader = AllocateZeroPool (PackageListLength);\r
109 ASSERT (PackageListHeader != NULL);\r
29870c8d 110 \r
b911d09f 111 CopyGuid (&PackageListHeader->PackageListGuid, GuidId);\r
7d582d6b 112 PackageListHeader->PackageLength = PackageListLength;\r
113\r
114 PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
115\r
116 Marker = MarkerBackup;\r
ccac388d 117 //\r
118 // Prepare the final package list.\r
119 //\r
7d582d6b 120 for (Index = 0; Index < NumberOfPackages; Index++) {\r
121 PackageArray = (UINT8 *) VA_ARG (Marker, VOID *);\r
122 CopyMem (&PackageLength, PackageArray, sizeof (UINT32));\r
123 PackageLength -= sizeof (UINT32);\r
124 PackageArray += sizeof (UINT32);\r
125 CopyMem (PackageListData, PackageArray, PackageLength);\r
126 PackageListData += PackageLength;\r
127 }\r
128\r
129 //\r
130 // Append EFI_HII_PACKAGE_END\r
131 //\r
132 PackageHeader.Type = EFI_HII_PACKAGE_END;\r
133 PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
134 CopyMem (PackageListData, &PackageHeader, PackageHeader.Length);\r
135\r
136 return PackageListHeader;\r
137}\r
138\r
ad1b3619 139/**\r
140 Assemble EFI_HII_PACKAGE_LIST according to the passed in packages.\r
141\r
142 If GuidId is NULL, then ASSERT.\r
143 If not enough resource to complete the operation, then ASSERT.\r
144\r
145 @param NumberOfPackages Number of packages.\r
29870c8d 146 @param GuidId Package GUID.\r
147 @param ... Variable argument list for packages to be assembled.\r
ad1b3619 148\r
149 @return EFI_HII_PACKAGE_LIST_HEADER Pointer of EFI_HII_PACKAGE_LIST_HEADER. The function will ASSERT if system has\r
29870c8d 150 not enough resource to complete the operation.\r
ad1b3619 151\r
152**/\r
7d582d6b 153EFI_HII_PACKAGE_LIST_HEADER *\r
154EFIAPI\r
155HiiLibPreparePackageList (\r
156 IN UINTN NumberOfPackages,\r
157 IN CONST EFI_GUID *GuidId,\r
158 ...\r
159 )\r
7d582d6b 160{\r
161 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
162 VA_LIST Marker;\r
163\r
e52c5a9f 164 ASSERT (GuidId != NULL);\r
165\r
7d582d6b 166 VA_START (Marker, GuidId);\r
167 PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Marker);\r
168 VA_END (Marker);\r
169\r
170 return PackageListHeader;\r
171}\r
172\r
bad46384 173\r
ad1b3619 174/**\r
175 This function allocates pool for an EFI_HII_PACKAGE_LIST structure\r
176 with additional space that is big enough to host all packages described by the variable \r
177 argument list of package pointers. The allocated structure is initialized using NumberOfPackages, \r
178 GuidId, and the variable length argument list of package pointers.\r
179\r
180 Then, EFI_HII_PACKAGE_LIST will be register to the default System HII Database. The\r
181 Handle to the newly registered Package List is returned throught HiiHandle.\r
182\r
183 If HiiHandle is NULL, then ASSERT.\r
184\r
185 @param NumberOfPackages The number of HII packages to register.\r
186 @param GuidId Package List GUID ID.\r
187 @param DriverHandle Optional. If not NULL, the DriverHandle on which an instance of DEVICE_PATH_PROTOCOL is installed.\r
188 This DriverHandle uniquely defines the device that the added packages are associated with.\r
189 @param HiiHandle On output, the HiiHandle is update with the handle which can be used to retrieve the Package \r
190 List later. If the functions failed to add the package to the default HII database, this value will\r
191 be set to NULL.\r
192 @param ... The variable argument list describing all HII Package.\r
193\r
194 @return EFI_SUCCESS If the packages are successfully added to the default HII database.\r
195 @return EFI_OUT_OF_RESOURCE Not enough resource to complete the operation.\r
196\r
197**/\r
7d582d6b 198EFI_STATUS\r
199EFIAPI\r
e52c5a9f 200HiiLibAddPackages (\r
7d582d6b 201 IN UINTN NumberOfPackages,\r
202 IN CONST EFI_GUID *GuidId,\r
203 IN EFI_HANDLE DriverHandle, OPTIONAL\r
2a10d874 204 OUT EFI_HII_HANDLE *HiiHandle,\r
7d582d6b 205 ...\r
206 )\r
207{\r
208 VA_LIST Args;\r
209 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
210 EFI_STATUS Status;\r
211\r
e52c5a9f 212 ASSERT (HiiHandle != NULL);\r
7d582d6b 213\r
54cf8780 214 LocateHiiProtocols ();\r
215\r
7d582d6b 216 VA_START (Args, HiiHandle);\r
217 PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Args);\r
218\r
219 Status = mHiiDatabaseProt->NewPackageList (mHiiDatabaseProt, PackageListHeader, DriverHandle, HiiHandle);\r
220 if (HiiHandle != NULL) {\r
221 if (EFI_ERROR (Status)) {\r
222 *HiiHandle = NULL;\r
223 }\r
224 }\r
225\r
226 FreePool (PackageListHeader);\r
227 VA_END (Args);\r
228 \r
229 return Status;\r
230}\r
231\r
ad1b3619 232/**\r
233 Removes a package list from the default HII database.\r
234\r
235 If HiiHandle is NULL, then ASSERT.\r
236 If HiiHandle is not a valid EFI_HII_HANDLE in the default HII database, then ASSERT.\r
237\r
238 @param HiiHandle The handle that was previously registered to the data base that is requested for removal.\r
239 List later.\r
240\r
ad1b3619 241**/\r
e52c5a9f 242VOID\r
7d582d6b 243EFIAPI\r
e52c5a9f 244HiiLibRemovePackages (\r
7d582d6b 245 IN EFI_HII_HANDLE HiiHandle\r
246 )\r
247{\r
e52c5a9f 248 EFI_STATUS Status;\r
29870c8d 249 ASSERT (IsHiiHandleRegistered (HiiHandle));\r
54cf8780 250\r
251 LocateHiiProtocols ();\r
252\r
e52c5a9f 253 Status = mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
254 ASSERT_EFI_ERROR (Status);\r
7d582d6b 255}\r
256\r
e52c5a9f 257\r
ad1b3619 258/**\r
259 Determines the handles that are currently active in the database.\r
260 It's the caller's responsibility to free handle buffer.\r
261\r
262 If HandleBufferLength is NULL, then ASSERT.\r
263 If HiiHandleBuffer is NULL, then ASSERT.\r
264\r
265 @param HandleBufferLength On input, a pointer to the length of the handle\r
266 buffer. On output, the length of the handle buffer\r
267 that is required for the handles found.\r
268 @param HiiHandleBuffer Pointer to an array of Hii Handles returned.\r
269\r
270 @retval EFI_SUCCESS Get an array of Hii Handles successfully.\r
271\r
272**/\r
7d582d6b 273EFI_STATUS\r
274EFIAPI\r
e52c5a9f 275HiiLibGetHiiHandles (\r
276 IN OUT UINTN *HandleBufferLength,\r
277 OUT EFI_HII_HANDLE **HiiHandleBuffer\r
7d582d6b 278 )\r
279{\r
e52c5a9f 280 UINTN BufferLength;\r
7d582d6b 281 EFI_STATUS Status;\r
7d582d6b 282\r
e52c5a9f 283 ASSERT (HandleBufferLength != NULL);\r
284 ASSERT (HiiHandleBuffer != NULL);\r
7d582d6b 285\r
e52c5a9f 286 BufferLength = 0;\r
7d582d6b 287\r
54cf8780 288 LocateHiiProtocols ();\r
289\r
e52c5a9f 290 //\r
291 // Try to find the actual buffer size for HiiHandle Buffer.\r
292 //\r
293 Status = mHiiDatabaseProt->ListPackageLists (\r
294 mHiiDatabaseProt,\r
295 EFI_HII_PACKAGE_TYPE_ALL,\r
7d582d6b 296 NULL,\r
e52c5a9f 297 &BufferLength,\r
298 *HiiHandleBuffer\r
7d582d6b 299 );\r
7d582d6b 300\r
e52c5a9f 301 if (Status == EFI_BUFFER_TOO_SMALL) {\r
302 *HiiHandleBuffer = AllocateZeroPool (BufferLength);\r
b911d09f 303 ASSERT (*HiiHandleBuffer != NULL);\r
e52c5a9f 304 Status = mHiiDatabaseProt->ListPackageLists (\r
305 mHiiDatabaseProt,\r
306 EFI_HII_PACKAGE_TYPE_ALL,\r
307 NULL,\r
308 &BufferLength,\r
309 *HiiHandleBuffer\r
310 );\r
311 //\r
312 // we should not fail here.\r
313 //\r
314 ASSERT_EFI_ERROR (Status);\r
7d582d6b 315 }\r
316\r
e52c5a9f 317 *HandleBufferLength = BufferLength;\r
7d582d6b 318\r
319 return Status;\r
320}\r
321\r
ad1b3619 322/**\r
323 Extract Hii package list GUID for given HII handle.\r
324\r
325 If HiiHandle could not be found in the default HII database, then ASSERT.\r
326 If Guid is NULL, then ASSERT.\r
327\r
328 @param Handle Hii handle\r
329 @param Guid Package list GUID\r
330\r
331 @retval EFI_SUCCESS Successfully extract GUID from Hii database.\r
332\r
333**/\r
7d582d6b 334EFI_STATUS\r
dd51a993 335EFIAPI\r
e52c5a9f 336HiiLibExtractGuidFromHiiHandle (\r
337 IN EFI_HII_HANDLE Handle,\r
338 OUT EFI_GUID *Guid\r
7d582d6b 339 )\r
340{\r
341 EFI_STATUS Status;\r
e52c5a9f 342 UINTN BufferSize;\r
343 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
7d582d6b 344\r
e52c5a9f 345 ASSERT (Guid != NULL);\r
29870c8d 346 ASSERT (IsHiiHandleRegistered (Handle));\r
7d582d6b 347\r
e52c5a9f 348 //\r
349 // Get HII PackageList\r
350 //\r
351 BufferSize = 0;\r
352 HiiPackageList = NULL;\r
54cf8780 353\r
354 LocateHiiProtocols ();\r
355\r
e52c5a9f 356 Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, Handle, &BufferSize, HiiPackageList);\r
357 ASSERT (Status != EFI_NOT_FOUND);\r
358 \r
359 if (Status == EFI_BUFFER_TOO_SMALL) {\r
360 HiiPackageList = AllocatePool (BufferSize);\r
361 ASSERT (HiiPackageList != NULL);\r
7d582d6b 362\r
e52c5a9f 363 Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, Handle, &BufferSize, HiiPackageList);\r
7d582d6b 364 }\r
7d582d6b 365 if (EFI_ERROR (Status)) {\r
b911d09f 366 FreePool (HiiPackageList);\r
7d582d6b 367 return Status;\r
368 }\r
369\r
e52c5a9f 370 //\r
371 // Extract GUID\r
372 //\r
b911d09f 373 CopyGuid (Guid, &HiiPackageList->PackageListGuid);\r
7d582d6b 374\r
29870c8d 375 FreePool (HiiPackageList);\r
7d582d6b 376\r
377 return EFI_SUCCESS;\r
378}\r
379\r
ad1b3619 380/**\r
381 Find HII Handle in the default HII database associated with given Device Path.\r
382\r
383 If DevicePath is NULL, then ASSERT.\r
384\r
385 @param DevicePath Device Path associated with the HII package list\r
386 handle.\r
387\r
388 @retval Handle HII package list Handle associated with the Device\r
389 Path.\r
390 @retval NULL Hii Package list handle is not found.\r
391\r
392**/\r
e52c5a9f 393EFI_HII_HANDLE\r
394EFIAPI\r
395HiiLibDevicePathToHiiHandle (\r
396 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
7d582d6b 397 )\r
7d582d6b 398{\r
e52c5a9f 399 EFI_STATUS Status;\r
400 EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;\r
401 UINTN BufferSize;\r
402 UINTN HandleCount;\r
403 UINTN Index;\r
404 EFI_HANDLE *Handles;\r
405 EFI_HANDLE Handle;\r
406 UINTN Size;\r
407 EFI_HANDLE DriverHandle;\r
408 EFI_HII_HANDLE *HiiHandles;\r
409 EFI_HII_HANDLE HiiHandle;\r
7d582d6b 410\r
e52c5a9f 411 ASSERT (DevicePath != NULL);\r
7d582d6b 412\r
dd51a993 413 //\r
e52c5a9f 414 // Locate Device Path Protocol handle buffer\r
7d582d6b 415 //\r
e52c5a9f 416 Status = gBS->LocateHandleBuffer (\r
417 ByProtocol,\r
418 &gEfiDevicePathProtocolGuid,\r
7d582d6b 419 NULL,\r
e52c5a9f 420 &HandleCount,\r
421 &Handles\r
7d582d6b 422 );\r
423 if (EFI_ERROR (Status)) {\r
e52c5a9f 424 return NULL;\r
7d582d6b 425 }\r
426\r
427 //\r
e52c5a9f 428 // Search Driver Handle by Device Path\r
7d582d6b 429 //\r
e52c5a9f 430 DriverHandle = NULL;\r
431 BufferSize = GetDevicePathSize (DevicePath);\r
432 for(Index = 0; Index < HandleCount; Index++) {\r
433 Handle = Handles[Index];\r
434 gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **) &TmpDevicePath);\r
435\r
436 //\r
437 // Check whether DevicePath match\r
438 //\r
439 Size = GetDevicePathSize (TmpDevicePath);\r
440 if ((Size == BufferSize) && CompareMem (DevicePath, TmpDevicePath, Size) == 0) {\r
441 DriverHandle = Handle;\r
442 break;\r
443 }\r
7d582d6b 444 }\r
29870c8d 445 FreePool (Handles);\r
e52c5a9f 446\r
447 if (DriverHandle == NULL) {\r
448 return NULL;\r
7d582d6b 449 }\r
450\r
54cf8780 451 LocateHiiProtocols ();\r
452\r
bad46384 453 //\r
e52c5a9f 454 // Retrieve all Hii Handles from HII database\r
7d582d6b 455 //\r
e52c5a9f 456 BufferSize = 0x1000;\r
457 HiiHandles = AllocatePool (BufferSize);\r
458 ASSERT (HiiHandles != NULL);\r
459 Status = mHiiDatabaseProt->ListPackageLists (\r
460 mHiiDatabaseProt,\r
461 EFI_HII_PACKAGE_TYPE_ALL,\r
462 NULL,\r
463 &BufferSize,\r
464 HiiHandles\r
465 );\r
466 if (Status == EFI_BUFFER_TOO_SMALL) {\r
29870c8d 467 FreePool (HiiHandles);\r
e52c5a9f 468 HiiHandles = AllocatePool (BufferSize);\r
469 ASSERT (HiiHandles != NULL);\r
470\r
471 Status = mHiiDatabaseProt->ListPackageLists (\r
472 mHiiDatabaseProt,\r
473 EFI_HII_PACKAGE_TYPE_ALL,\r
474 NULL,\r
475 &BufferSize,\r
476 HiiHandles\r
477 );\r
478 }\r
7d582d6b 479\r
e52c5a9f 480 if (EFI_ERROR (Status)) {\r
29870c8d 481 FreePool (HiiHandles);\r
e52c5a9f 482 return NULL;\r
483 }\r
7d582d6b 484\r
e52c5a9f 485 //\r
486 // Search Hii Handle by Driver Handle\r
487 //\r
488 HiiHandle = NULL;\r
489 HandleCount = BufferSize / sizeof (EFI_HII_HANDLE);\r
490 for (Index = 0; Index < HandleCount; Index++) {\r
491 Status = mHiiDatabaseProt->GetPackageListHandle (\r
492 mHiiDatabaseProt,\r
493 HiiHandles[Index],\r
494 &Handle\r
495 );\r
496 if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {\r
497 HiiHandle = HiiHandles[Index];\r
498 break;\r
7d582d6b 499 }\r
7d582d6b 500 }\r
501\r
29870c8d 502 FreePool (HiiHandles);\r
e52c5a9f 503 return HiiHandle;\r
504}\r
7d582d6b 505\r
55a9663b 506/**\r
507 Exports the contents of one or all package lists in the HII database into a buffer.\r
508\r
509 If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database, \r
510 then ASSERT.\r
511 If PackageListHeader is NULL, then ASSERT.\r
512 If PackageListSize is NULL, then ASSERT.\r
513\r
514 @param Handle The HII Handle.\r
515 @param PackageListHeader A pointer to a buffer that will contain the results of \r
516 the export function.\r
517 @param PackageListSize On output, the length of the buffer that is required for the exported data.\r
518\r
519 @retval EFI_SUCCESS Package exported.\r
520\r
521 @retval EFI_OUT_OF_RESOURCES Not enought memory to complete the operations.\r
522\r
523**/\r
524EFI_STATUS \r
525EFIAPI\r
526HiiLibExportPackageLists (\r
527 IN EFI_HII_HANDLE Handle,\r
528 OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader,\r
529 OUT UINTN *PackageListSize\r
530 )\r
531{\r
532 EFI_STATUS Status;\r
533 UINTN Size;\r
534 EFI_HII_PACKAGE_LIST_HEADER *PackageListHdr;\r
535\r
536 ASSERT (PackageListSize != NULL);\r
537 ASSERT (PackageListHeader != NULL);\r
538\r
539 LocateHiiProtocols ();\r
540\r
541 if (Handle != NULL) {\r
542 ASSERT (IsHiiHandleRegistered (Handle));\r
543 }\r
544\r
545 Size = 0;\r
546 PackageListHdr = NULL;\r
547 Status = mHiiDatabaseProt->ExportPackageLists (\r
548 mHiiDatabaseProt,\r
549 Handle,\r
550 &Size,\r
551 PackageListHdr\r
552 );\r
553 ASSERT_EFI_ERROR (Status != EFI_BUFFER_TOO_SMALL);\r
554 \r
555 if (Status == EFI_BUFFER_TOO_SMALL) {\r
556 PackageListHdr = AllocateZeroPool (Size);\r
557 \r
558 if (PackageListHeader == NULL) {\r
559 return EFI_OUT_OF_RESOURCES;\r
560 } else {\r
561 Status = mHiiDatabaseProt->ExportPackageLists (\r
562 mHiiDatabaseProt,\r
563 Handle,\r
564 &Size,\r
565 PackageListHdr\r
566 );\r
567 }\r
568 }\r
569\r
570 if (!EFI_ERROR (Status)) {\r
571 *PackageListHeader = PackageListHdr;\r
572 *PackageListSize = Size;\r
573 } else {\r
574 FreePool (PackageListHdr);\r
575 }\r
576\r
577 return Status;\r
578}\r
579\r
580\r
581EFI_STATUS\r
582EFIAPI\r
583HiiLibListPackageLists (\r
584 IN UINT8 PackageType,\r
585 IN CONST EFI_GUID *PackageGuid,\r
586 IN OUT UINTN *HandleBufferLength,\r
587 OUT EFI_HII_HANDLE **HandleBuffer\r
588 )\r
589{\r
590 EFI_STATUS Status;\r
591 \r
592 ASSERT (HandleBufferLength != NULL);\r
593 ASSERT (HandleBuffer != NULL);\r
594 \r
595 *HandleBufferLength = 0;\r
596 *HandleBuffer = NULL;\r
597\r
598 LocateHiiProtocols ();\r
599\r
600 Status = mHiiDatabaseProt->ListPackageLists (\r
601 mHiiDatabaseProt,\r
602 PackageType,\r
603 PackageGuid,\r
604 HandleBufferLength,\r
605 *HandleBuffer\r
606 );\r
607 if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
608 //\r
609 // No packages is registered to UEFI HII Database, just return EFI_SUCCESS.\r
610 // \r
611 //\r
612 return Status;\r
613 }\r
614\r
615 *HandleBuffer = AllocateZeroPool (*HandleBufferLength);\r
616 \r
617 if (*HandleBuffer == NULL) {\r
618 return EFI_OUT_OF_RESOURCES;\r
619 }\r
620 \r
621 return mHiiDatabaseProt->ListPackageLists (\r
622 mHiiDatabaseProt,\r
623 PackageType,\r
624 PackageGuid,\r
625 HandleBufferLength,\r
626 *HandleBuffer\r
627 );\r
628 \r
629}\r
ad1b3619 630/**\r
631 This function check if the Hii Handle is a valid handle registered\r
632 in the HII database.\r
633\r
634 @param HiiHandle The HII Handle.\r
635\r
636 @retval TRUE If it is a valid HII handle.\r
637 @retval FALSE If it is a invalid HII handle.\r
638**/\r
e52c5a9f 639BOOLEAN\r
640IsHiiHandleRegistered (\r
641 EFI_HII_HANDLE HiiHandle\r
642 )\r
643{\r
644 EFI_STATUS Status;\r
645 UINTN BufferSize;\r
646 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
647\r
648 ASSERT (HiiHandle != NULL);\r
649\r
650 HiiPackageList = NULL;\r
651 BufferSize = 0;\r
54cf8780 652\r
653 LocateHiiProtocols ();\r
654\r
e52c5a9f 655 Status = mHiiDatabaseProt->ExportPackageLists (\r
656 mHiiDatabaseProt,\r
657 HiiHandle,\r
658 &BufferSize,\r
659 HiiPackageList\r
660 );\r
661\r
662 return (BOOLEAN) (Status == EFI_BUFFER_TOO_SMALL);\r
dd51a993 663}\r
7d582d6b 664\r