]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/HiiLib/HiiLib.c
Correct two minor comments
[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
54cf8780 21 This function locate Hii relative protocols for later usage.\r
f8d18bad 22 \r
23 The constructor function caches the protocol pointer of HII Database Protocol\r
24 and Hii String Protocol.\r
25 \r
26 It will ASSERT() if either of the protocol can't be located.\r
27\r
28 @param ImageHandle The firmware allocated handle for the EFI image.\r
29 @param SystemTable A pointer to the EFI System Table.\r
30\r
31 @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.\r
54cf8780 32\r
e52c5a9f 33**/\r
f8d18bad 34EFI_STATUS\r
35EFIAPI\r
36HiiLibConstructor (\r
37 IN EFI_HANDLE ImageHandle,\r
38 IN EFI_SYSTEM_TABLE *SystemTable\r
7d582d6b 39 )\r
40{\r
54cf8780 41 EFI_STATUS Status;\r
42\r
54cf8780 43 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &mHiiDatabaseProt);\r
7d582d6b 44 ASSERT_EFI_ERROR (Status);\r
7d582d6b 45\r
54cf8780 46 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &mHiiStringProt);\r
7d582d6b 47 ASSERT_EFI_ERROR (Status);\r
f8d18bad 48\r
49 return EFI_SUCCESS;\r
7d582d6b 50}\r
51\r
7d582d6b 52\r
53\r
ad1b3619 54/**\r
55 This funciton build the package list based on the package number,\r
56 the GUID of the package list and the list of pointer which point to\r
57 package header that defined by UEFI VFR compiler and StringGather\r
58 tool.\r
59\r
29870c8d 60 #pragma pack (push, 1)\r
61 typedef struct {\r
62 UINT32 BinaryLength;\r
63 EFI_HII_PACKAGE_HEADER PackageHeader;\r
5f300691 64 } EDKII_AUTOGEN_PACKAGES_HEADER;\r
29870c8d 65 #pragma pack (pop)\r
66\r
ad1b3619 67 If there is not enough resource for the new package list,\r
68 the function will ASSERT.\r
69\r
70 @param NumberOfPackages The number of packages be \r
71 @param GuidId The GUID for the package list to be generated.\r
72 @param Marker The variable argument list. Each entry represent a specific package header that is\r
73 generated by VFR compiler and StrGather tool. The first 4 bytes is a UINT32 value\r
74 that indicate the overall length of the package.\r
75\r
76 @return The pointer to the package list header.\r
77\r
78**/\r
7d582d6b 79EFI_HII_PACKAGE_LIST_HEADER *\r
80InternalHiiLibPreparePackages (\r
81 IN UINTN NumberOfPackages,\r
ad1b3619 82 IN CONST EFI_GUID *GuidId,\r
1db1f6ad 83 IN VA_LIST Marker\r
7d582d6b 84 )\r
85{\r
86 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
87 UINT8 *PackageListData;\r
88 UINT32 PackageListLength;\r
89 UINT32 PackageLength;\r
90 EFI_HII_PACKAGE_HEADER PackageHeader;\r
91 UINT8 *PackageArray;\r
92 UINTN Index;\r
93 VA_LIST MarkerBackup;\r
94\r
95 PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
96\r
97 MarkerBackup = Marker;\r
ccac388d 98\r
99 //\r
100 // Count the lenth of the final package list.\r
101 //\r
7d582d6b 102 for (Index = 0; Index < NumberOfPackages; Index++) {\r
103 CopyMem (&PackageLength, VA_ARG (Marker, VOID *), sizeof (UINT32));\r
29870c8d 104 //\r
105 // Do not count the BinaryLength field.\r
106 //\r
7d582d6b 107 PackageListLength += (PackageLength - sizeof (UINT32));\r
108 }\r
109\r
110 //\r
111 // Include the lenght of EFI_HII_PACKAGE_END\r
112 //\r
113 PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER);\r
114 PackageListHeader = AllocateZeroPool (PackageListLength);\r
115 ASSERT (PackageListHeader != NULL);\r
29870c8d 116 \r
b911d09f 117 CopyGuid (&PackageListHeader->PackageListGuid, GuidId);\r
7d582d6b 118 PackageListHeader->PackageLength = PackageListLength;\r
119\r
120 PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
121\r
122 Marker = MarkerBackup;\r
ccac388d 123 //\r
124 // Prepare the final package list.\r
125 //\r
7d582d6b 126 for (Index = 0; Index < NumberOfPackages; Index++) {\r
127 PackageArray = (UINT8 *) VA_ARG (Marker, VOID *);\r
a8ff9715
LG
128 //\r
129 // CopyMem is used for UINT32 to cover the unaligned address access.\r
130 //\r
7d582d6b 131 CopyMem (&PackageLength, PackageArray, sizeof (UINT32));\r
132 PackageLength -= sizeof (UINT32);\r
133 PackageArray += sizeof (UINT32);\r
134 CopyMem (PackageListData, PackageArray, PackageLength);\r
135 PackageListData += PackageLength;\r
136 }\r
137\r
138 //\r
139 // Append EFI_HII_PACKAGE_END\r
140 //\r
141 PackageHeader.Type = EFI_HII_PACKAGE_END;\r
142 PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
143 CopyMem (PackageListData, &PackageHeader, PackageHeader.Length);\r
144\r
145 return PackageListHeader;\r
146}\r
147\r
ad1b3619 148/**\r
149 Assemble EFI_HII_PACKAGE_LIST according to the passed in packages.\r
150\r
151 If GuidId is NULL, then ASSERT.\r
152 If not enough resource to complete the operation, then ASSERT.\r
153\r
154 @param NumberOfPackages Number of packages.\r
29870c8d 155 @param GuidId Package GUID.\r
156 @param ... Variable argument list for packages to be assembled.\r
ad1b3619 157\r
c57da111 158 @return Pointer of EFI_HII_PACKAGE_LIST_HEADER.\r
ad1b3619 159\r
160**/\r
7d582d6b 161EFI_HII_PACKAGE_LIST_HEADER *\r
162EFIAPI\r
163HiiLibPreparePackageList (\r
164 IN UINTN NumberOfPackages,\r
165 IN CONST EFI_GUID *GuidId,\r
166 ...\r
167 )\r
7d582d6b 168{\r
169 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
170 VA_LIST Marker;\r
171\r
e52c5a9f 172 ASSERT (GuidId != NULL);\r
173\r
7d582d6b 174 VA_START (Marker, GuidId);\r
175 PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Marker);\r
176 VA_END (Marker);\r
177\r
178 return PackageListHeader;\r
179}\r
180\r
bad46384 181\r
ad1b3619 182/**\r
183 This function allocates pool for an EFI_HII_PACKAGE_LIST structure\r
184 with additional space that is big enough to host all packages described by the variable \r
185 argument list of package pointers. The allocated structure is initialized using NumberOfPackages, \r
186 GuidId, and the variable length argument list of package pointers.\r
187\r
188 Then, EFI_HII_PACKAGE_LIST will be register to the default System HII Database. The\r
189 Handle to the newly registered Package List is returned throught HiiHandle.\r
190\r
191 If HiiHandle is NULL, then ASSERT.\r
192\r
193 @param NumberOfPackages The number of HII packages to register.\r
194 @param GuidId Package List GUID ID.\r
195 @param DriverHandle Optional. If not NULL, the DriverHandle on which an instance of DEVICE_PATH_PROTOCOL is installed.\r
196 This DriverHandle uniquely defines the device that the added packages are associated with.\r
197 @param HiiHandle On output, the HiiHandle is update with the handle which can be used to retrieve the Package \r
198 List later. If the functions failed to add the package to the default HII database, this value will\r
199 be set to NULL.\r
200 @param ... The variable argument list describing all HII Package.\r
201\r
202 @return EFI_SUCCESS If the packages are successfully added to the default HII database.\r
203 @return EFI_OUT_OF_RESOURCE Not enough resource to complete the operation.\r
204\r
205**/\r
7d582d6b 206EFI_STATUS\r
207EFIAPI\r
e52c5a9f 208HiiLibAddPackages (\r
7d582d6b 209 IN UINTN NumberOfPackages,\r
210 IN CONST EFI_GUID *GuidId,\r
211 IN EFI_HANDLE DriverHandle, OPTIONAL\r
2a10d874 212 OUT EFI_HII_HANDLE *HiiHandle,\r
7d582d6b 213 ...\r
214 )\r
215{\r
216 VA_LIST Args;\r
217 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
218 EFI_STATUS Status;\r
219\r
e52c5a9f 220 ASSERT (HiiHandle != NULL);\r
7d582d6b 221\r
222 VA_START (Args, HiiHandle);\r
223 PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Args);\r
224\r
225 Status = mHiiDatabaseProt->NewPackageList (mHiiDatabaseProt, PackageListHeader, DriverHandle, HiiHandle);\r
226 if (HiiHandle != NULL) {\r
227 if (EFI_ERROR (Status)) {\r
228 *HiiHandle = NULL;\r
229 }\r
230 }\r
231\r
232 FreePool (PackageListHeader);\r
233 VA_END (Args);\r
234 \r
235 return Status;\r
236}\r
237\r
ad1b3619 238/**\r
239 Removes a package list from the default HII database.\r
240\r
241 If HiiHandle is NULL, then ASSERT.\r
242 If HiiHandle is not a valid EFI_HII_HANDLE in the default HII database, then ASSERT.\r
243\r
244 @param HiiHandle The handle that was previously registered to the data base that is requested for removal.\r
245 List later.\r
246\r
ad1b3619 247**/\r
e52c5a9f 248VOID\r
7d582d6b 249EFIAPI\r
e52c5a9f 250HiiLibRemovePackages (\r
7d582d6b 251 IN EFI_HII_HANDLE HiiHandle\r
252 )\r
253{\r
e52c5a9f 254 EFI_STATUS Status;\r
29870c8d 255 ASSERT (IsHiiHandleRegistered (HiiHandle));\r
54cf8780 256\r
e52c5a9f 257 Status = mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
258 ASSERT_EFI_ERROR (Status);\r
7d582d6b 259}\r
260\r
e52c5a9f 261\r
ad1b3619 262/**\r
263 Determines the handles that are currently active in the database.\r
264 It's the caller's responsibility to free handle buffer.\r
265\r
266 If HandleBufferLength is NULL, then ASSERT.\r
267 If HiiHandleBuffer is NULL, then ASSERT.\r
268\r
269 @param HandleBufferLength On input, a pointer to the length of the handle\r
270 buffer. On output, the length of the handle buffer\r
271 that is required for the handles found.\r
272 @param HiiHandleBuffer Pointer to an array of Hii Handles returned.\r
273\r
274 @retval EFI_SUCCESS Get an array of Hii Handles successfully.\r
275\r
276**/\r
7d582d6b 277EFI_STATUS\r
278EFIAPI\r
e52c5a9f 279HiiLibGetHiiHandles (\r
280 IN OUT UINTN *HandleBufferLength,\r
281 OUT EFI_HII_HANDLE **HiiHandleBuffer\r
7d582d6b 282 )\r
283{\r
e52c5a9f 284 UINTN BufferLength;\r
7d582d6b 285 EFI_STATUS Status;\r
7d582d6b 286\r
e52c5a9f 287 ASSERT (HandleBufferLength != NULL);\r
288 ASSERT (HiiHandleBuffer != NULL);\r
7d582d6b 289\r
e52c5a9f 290 BufferLength = 0;\r
7d582d6b 291\r
e52c5a9f 292 //\r
293 // Try to find the actual buffer size for HiiHandle Buffer.\r
294 //\r
295 Status = mHiiDatabaseProt->ListPackageLists (\r
296 mHiiDatabaseProt,\r
297 EFI_HII_PACKAGE_TYPE_ALL,\r
7d582d6b 298 NULL,\r
e52c5a9f 299 &BufferLength,\r
300 *HiiHandleBuffer\r
7d582d6b 301 );\r
7d582d6b 302\r
e52c5a9f 303 if (Status == EFI_BUFFER_TOO_SMALL) {\r
304 *HiiHandleBuffer = AllocateZeroPool (BufferLength);\r
b911d09f 305 ASSERT (*HiiHandleBuffer != NULL);\r
e52c5a9f 306 Status = mHiiDatabaseProt->ListPackageLists (\r
307 mHiiDatabaseProt,\r
308 EFI_HII_PACKAGE_TYPE_ALL,\r
309 NULL,\r
310 &BufferLength,\r
311 *HiiHandleBuffer\r
312 );\r
313 //\r
314 // we should not fail here.\r
315 //\r
316 ASSERT_EFI_ERROR (Status);\r
7d582d6b 317 }\r
318\r
e52c5a9f 319 *HandleBufferLength = BufferLength;\r
7d582d6b 320\r
321 return Status;\r
322}\r
323\r
ad1b3619 324/**\r
325 Extract Hii package list GUID for given HII handle.\r
326\r
327 If HiiHandle could not be found in the default HII database, then ASSERT.\r
328 If Guid is NULL, then ASSERT.\r
329\r
330 @param Handle Hii handle\r
331 @param Guid Package list GUID\r
332\r
333 @retval EFI_SUCCESS Successfully extract GUID from Hii database.\r
334\r
335**/\r
7d582d6b 336EFI_STATUS\r
dd51a993 337EFIAPI\r
e52c5a9f 338HiiLibExtractGuidFromHiiHandle (\r
339 IN EFI_HII_HANDLE Handle,\r
340 OUT EFI_GUID *Guid\r
7d582d6b 341 )\r
342{\r
343 EFI_STATUS Status;\r
e52c5a9f 344 UINTN BufferSize;\r
345 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
7d582d6b 346\r
e52c5a9f 347 ASSERT (Guid != NULL);\r
29870c8d 348 ASSERT (IsHiiHandleRegistered (Handle));\r
7d582d6b 349\r
e52c5a9f 350 //\r
351 // Get HII PackageList\r
352 //\r
353 BufferSize = 0;\r
354 HiiPackageList = NULL;\r
54cf8780 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
bad46384 451 //\r
e52c5a9f 452 // Retrieve all Hii Handles from HII database\r
7d582d6b 453 //\r
e52c5a9f 454 BufferSize = 0x1000;\r
455 HiiHandles = AllocatePool (BufferSize);\r
456 ASSERT (HiiHandles != NULL);\r
457 Status = mHiiDatabaseProt->ListPackageLists (\r
458 mHiiDatabaseProt,\r
459 EFI_HII_PACKAGE_TYPE_ALL,\r
460 NULL,\r
461 &BufferSize,\r
462 HiiHandles\r
463 );\r
464 if (Status == EFI_BUFFER_TOO_SMALL) {\r
29870c8d 465 FreePool (HiiHandles);\r
e52c5a9f 466 HiiHandles = AllocatePool (BufferSize);\r
467 ASSERT (HiiHandles != NULL);\r
468\r
469 Status = mHiiDatabaseProt->ListPackageLists (\r
470 mHiiDatabaseProt,\r
471 EFI_HII_PACKAGE_TYPE_ALL,\r
472 NULL,\r
473 &BufferSize,\r
474 HiiHandles\r
475 );\r
476 }\r
7d582d6b 477\r
e52c5a9f 478 if (EFI_ERROR (Status)) {\r
29870c8d 479 FreePool (HiiHandles);\r
e52c5a9f 480 return NULL;\r
481 }\r
7d582d6b 482\r
e52c5a9f 483 //\r
484 // Search Hii Handle by Driver Handle\r
485 //\r
486 HiiHandle = NULL;\r
487 HandleCount = BufferSize / sizeof (EFI_HII_HANDLE);\r
488 for (Index = 0; Index < HandleCount; Index++) {\r
489 Status = mHiiDatabaseProt->GetPackageListHandle (\r
490 mHiiDatabaseProt,\r
491 HiiHandles[Index],\r
492 &Handle\r
493 );\r
494 if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {\r
495 HiiHandle = HiiHandles[Index];\r
496 break;\r
7d582d6b 497 }\r
7d582d6b 498 }\r
499\r
29870c8d 500 FreePool (HiiHandles);\r
e52c5a9f 501 return HiiHandle;\r
502}\r
7d582d6b 503\r
55a9663b 504/**\r
505 Exports the contents of one or all package lists in the HII database into a buffer.\r
506\r
507 If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database, \r
508 then ASSERT.\r
509 If PackageListHeader is NULL, then ASSERT.\r
510 If PackageListSize is NULL, then ASSERT.\r
511\r
512 @param Handle The HII Handle.\r
513 @param PackageListHeader A pointer to a buffer that will contain the results of \r
514 the export function.\r
515 @param PackageListSize On output, the length of the buffer that is required for the exported data.\r
516\r
517 @retval EFI_SUCCESS Package exported.\r
518\r
519 @retval EFI_OUT_OF_RESOURCES Not enought memory to complete the operations.\r
520\r
521**/\r
522EFI_STATUS \r
523EFIAPI\r
524HiiLibExportPackageLists (\r
525 IN EFI_HII_HANDLE Handle,\r
526 OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader,\r
527 OUT UINTN *PackageListSize\r
528 )\r
529{\r
530 EFI_STATUS Status;\r
531 UINTN Size;\r
532 EFI_HII_PACKAGE_LIST_HEADER *PackageListHdr;\r
533\r
534 ASSERT (PackageListSize != NULL);\r
535 ASSERT (PackageListHeader != NULL);\r
536\r
55a9663b 537 if (Handle != NULL) {\r
538 ASSERT (IsHiiHandleRegistered (Handle));\r
539 }\r
540\r
541 Size = 0;\r
542 PackageListHdr = NULL;\r
543 Status = mHiiDatabaseProt->ExportPackageLists (\r
544 mHiiDatabaseProt,\r
545 Handle,\r
546 &Size,\r
547 PackageListHdr\r
548 );\r
549 ASSERT_EFI_ERROR (Status != EFI_BUFFER_TOO_SMALL);\r
550 \r
551 if (Status == EFI_BUFFER_TOO_SMALL) {\r
552 PackageListHdr = AllocateZeroPool (Size);\r
553 \r
554 if (PackageListHeader == NULL) {\r
555 return EFI_OUT_OF_RESOURCES;\r
556 } else {\r
557 Status = mHiiDatabaseProt->ExportPackageLists (\r
558 mHiiDatabaseProt,\r
559 Handle,\r
560 &Size,\r
561 PackageListHdr\r
562 );\r
563 }\r
564 }\r
565\r
566 if (!EFI_ERROR (Status)) {\r
567 *PackageListHeader = PackageListHdr;\r
568 *PackageListSize = Size;\r
569 } else {\r
570 FreePool (PackageListHdr);\r
571 }\r
572\r
573 return Status;\r
574}\r
575\r
c4a00638 576/**\r
577 \r
578 This function returns a list of the package handles of the \r
579 specified type that are currently active in the HII database. The \r
580 pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package \r
581 handles to be listed.\r
55a9663b 582\r
c4a00638 583 If HandleBufferLength is NULL, then ASSERT.\r
584 If HandleBuffer is NULL, the ASSERT.\r
585 If PackageType is EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is\r
586 NULL, then ASSERT.\r
587 If PackageType is not EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is not\r
588 NULL, then ASSERT.\r
589 \r
590 \r
591 @param PackageType Specifies the package type of the packages\r
592 to list or EFI_HII_PACKAGE_TYPE_ALL for\r
593 all packages to be listed.\r
594 \r
595 @param PackageGuid If PackageType is\r
596 EFI_HII_PACKAGE_TYPE_GUID, then this is\r
597 the pointer to the GUID which must match\r
598 the Guid field of\r
599 EFI_HII_PACKAGE_GUID_HEADER. Otherwise, it\r
600 must be NULL.\r
601 \r
602 @param HandleBufferLength On output, the length of the handle buffer\r
603 that is required for the handles found.\r
604\r
605 @param HandleBuffer On output, an array of EFI_HII_HANDLE instances returned.\r
606 The caller is responcible to free this pointer allocated.\r
607\r
608 @retval EFI_SUCCESS The matching handles are outputed successfully.\r
609 HandleBufferLength is updated with the actual length.\r
610 @retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operation.\r
611 @retval EFI_NOT_FOUND No matching handle could not be found in database.\r
612**/\r
55a9663b 613EFI_STATUS\r
614EFIAPI\r
615HiiLibListPackageLists (\r
616 IN UINT8 PackageType,\r
617 IN CONST EFI_GUID *PackageGuid,\r
c4a00638 618 OUT UINTN *HandleBufferLength,\r
55a9663b 619 OUT EFI_HII_HANDLE **HandleBuffer\r
620 )\r
621{\r
622 EFI_STATUS Status;\r
623 \r
624 ASSERT (HandleBufferLength != NULL);\r
625 ASSERT (HandleBuffer != NULL);\r
626 \r
627 *HandleBufferLength = 0;\r
628 *HandleBuffer = NULL;\r
629\r
c4a00638 630 if (PackageType == EFI_HII_PACKAGE_TYPE_GUID) {\r
631 ASSERT (PackageGuid != NULL);\r
632 } else {\r
633 ASSERT (PackageGuid == NULL);\r
634 }\r
635\r
55a9663b 636 Status = mHiiDatabaseProt->ListPackageLists (\r
637 mHiiDatabaseProt,\r
638 PackageType,\r
639 PackageGuid,\r
640 HandleBufferLength,\r
641 *HandleBuffer\r
642 );\r
643 if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
644 //\r
c4a00638 645 // No packages is registered to UEFI HII Database, just return.\r
55a9663b 646 // \r
647 //\r
648 return Status;\r
649 }\r
650\r
651 *HandleBuffer = AllocateZeroPool (*HandleBufferLength);\r
652 \r
653 if (*HandleBuffer == NULL) {\r
654 return EFI_OUT_OF_RESOURCES;\r
655 }\r
656 \r
657 return mHiiDatabaseProt->ListPackageLists (\r
658 mHiiDatabaseProt,\r
659 PackageType,\r
660 PackageGuid,\r
661 HandleBufferLength,\r
662 *HandleBuffer\r
663 );\r
664 \r
665}\r
ad1b3619 666/**\r
667 This function check if the Hii Handle is a valid handle registered\r
668 in the HII database.\r
669\r
670 @param HiiHandle The HII Handle.\r
671\r
672 @retval TRUE If it is a valid HII handle.\r
673 @retval FALSE If it is a invalid HII handle.\r
674**/\r
e52c5a9f 675BOOLEAN\r
676IsHiiHandleRegistered (\r
677 EFI_HII_HANDLE HiiHandle\r
678 )\r
679{\r
680 EFI_STATUS Status;\r
681 UINTN BufferSize;\r
682 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
683\r
684 ASSERT (HiiHandle != NULL);\r
685\r
686 HiiPackageList = NULL;\r
687 BufferSize = 0;\r
54cf8780 688\r
e52c5a9f 689 Status = mHiiDatabaseProt->ExportPackageLists (\r
690 mHiiDatabaseProt,\r
691 HiiHandle,\r
692 &BufferSize,\r
693 HiiPackageList\r
694 );\r
695\r
696 return (BOOLEAN) (Status == EFI_BUFFER_TOO_SMALL);\r
dd51a993 697}\r
7d582d6b 698\r