]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/HiiLib/HiiLib.c
cleanup some 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
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
a8ff9715
LG
122 //\r
123 // CopyMem is used for UINT32 to cover the unaligned address access.\r
124 //\r
7d582d6b 125 CopyMem (&PackageLength, PackageArray, sizeof (UINT32));\r
126 PackageLength -= sizeof (UINT32);\r
127 PackageArray += sizeof (UINT32);\r
128 CopyMem (PackageListData, PackageArray, PackageLength);\r
129 PackageListData += PackageLength;\r
130 }\r
131\r
132 //\r
133 // Append EFI_HII_PACKAGE_END\r
134 //\r
135 PackageHeader.Type = EFI_HII_PACKAGE_END;\r
136 PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
137 CopyMem (PackageListData, &PackageHeader, PackageHeader.Length);\r
138\r
139 return PackageListHeader;\r
140}\r
141\r
ad1b3619 142/**\r
143 Assemble EFI_HII_PACKAGE_LIST according to the passed in packages.\r
144\r
145 If GuidId is NULL, then ASSERT.\r
146 If not enough resource to complete the operation, then ASSERT.\r
147\r
148 @param NumberOfPackages Number of packages.\r
29870c8d 149 @param GuidId Package GUID.\r
150 @param ... Variable argument list for packages to be assembled.\r
ad1b3619 151\r
c57da111 152 @return Pointer of EFI_HII_PACKAGE_LIST_HEADER.\r
ad1b3619 153\r
154**/\r
7d582d6b 155EFI_HII_PACKAGE_LIST_HEADER *\r
156EFIAPI\r
157HiiLibPreparePackageList (\r
158 IN UINTN NumberOfPackages,\r
159 IN CONST EFI_GUID *GuidId,\r
160 ...\r
161 )\r
7d582d6b 162{\r
163 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
164 VA_LIST Marker;\r
165\r
e52c5a9f 166 ASSERT (GuidId != NULL);\r
167\r
7d582d6b 168 VA_START (Marker, GuidId);\r
169 PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Marker);\r
170 VA_END (Marker);\r
171\r
172 return PackageListHeader;\r
173}\r
174\r
bad46384 175\r
ad1b3619 176/**\r
177 This function allocates pool for an EFI_HII_PACKAGE_LIST structure\r
178 with additional space that is big enough to host all packages described by the variable \r
179 argument list of package pointers. The allocated structure is initialized using NumberOfPackages, \r
180 GuidId, and the variable length argument list of package pointers.\r
181\r
182 Then, EFI_HII_PACKAGE_LIST will be register to the default System HII Database. The\r
183 Handle to the newly registered Package List is returned throught HiiHandle.\r
184\r
185 If HiiHandle is NULL, then ASSERT.\r
186\r
187 @param NumberOfPackages The number of HII packages to register.\r
188 @param GuidId Package List GUID ID.\r
189 @param DriverHandle Optional. If not NULL, the DriverHandle on which an instance of DEVICE_PATH_PROTOCOL is installed.\r
190 This DriverHandle uniquely defines the device that the added packages are associated with.\r
191 @param HiiHandle On output, the HiiHandle is update with the handle which can be used to retrieve the Package \r
192 List later. If the functions failed to add the package to the default HII database, this value will\r
193 be set to NULL.\r
194 @param ... The variable argument list describing all HII Package.\r
195\r
196 @return EFI_SUCCESS If the packages are successfully added to the default HII database.\r
197 @return EFI_OUT_OF_RESOURCE Not enough resource to complete the operation.\r
198\r
199**/\r
7d582d6b 200EFI_STATUS\r
201EFIAPI\r
e52c5a9f 202HiiLibAddPackages (\r
7d582d6b 203 IN UINTN NumberOfPackages,\r
204 IN CONST EFI_GUID *GuidId,\r
205 IN EFI_HANDLE DriverHandle, OPTIONAL\r
2a10d874 206 OUT EFI_HII_HANDLE *HiiHandle,\r
7d582d6b 207 ...\r
208 )\r
209{\r
210 VA_LIST Args;\r
211 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
212 EFI_STATUS Status;\r
213\r
e52c5a9f 214 ASSERT (HiiHandle != NULL);\r
7d582d6b 215\r
54cf8780 216 LocateHiiProtocols ();\r
217\r
7d582d6b 218 VA_START (Args, HiiHandle);\r
219 PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Args);\r
220\r
221 Status = mHiiDatabaseProt->NewPackageList (mHiiDatabaseProt, PackageListHeader, DriverHandle, HiiHandle);\r
222 if (HiiHandle != NULL) {\r
223 if (EFI_ERROR (Status)) {\r
224 *HiiHandle = NULL;\r
225 }\r
226 }\r
227\r
228 FreePool (PackageListHeader);\r
229 VA_END (Args);\r
230 \r
231 return Status;\r
232}\r
233\r
ad1b3619 234/**\r
235 Removes a package list from the default HII database.\r
236\r
237 If HiiHandle is NULL, then ASSERT.\r
238 If HiiHandle is not a valid EFI_HII_HANDLE in the default HII database, then ASSERT.\r
239\r
240 @param HiiHandle The handle that was previously registered to the data base that is requested for removal.\r
241 List later.\r
242\r
ad1b3619 243**/\r
e52c5a9f 244VOID\r
7d582d6b 245EFIAPI\r
e52c5a9f 246HiiLibRemovePackages (\r
7d582d6b 247 IN EFI_HII_HANDLE HiiHandle\r
248 )\r
249{\r
e52c5a9f 250 EFI_STATUS Status;\r
29870c8d 251 ASSERT (IsHiiHandleRegistered (HiiHandle));\r
54cf8780 252\r
253 LocateHiiProtocols ();\r
254\r
e52c5a9f 255 Status = mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
256 ASSERT_EFI_ERROR (Status);\r
7d582d6b 257}\r
258\r
e52c5a9f 259\r
ad1b3619 260/**\r
261 Determines the handles that are currently active in the database.\r
262 It's the caller's responsibility to free handle buffer.\r
263\r
264 If HandleBufferLength is NULL, then ASSERT.\r
265 If HiiHandleBuffer is NULL, then ASSERT.\r
266\r
267 @param HandleBufferLength On input, a pointer to the length of the handle\r
268 buffer. On output, the length of the handle buffer\r
269 that is required for the handles found.\r
270 @param HiiHandleBuffer Pointer to an array of Hii Handles returned.\r
271\r
272 @retval EFI_SUCCESS Get an array of Hii Handles successfully.\r
273\r
274**/\r
7d582d6b 275EFI_STATUS\r
276EFIAPI\r
e52c5a9f 277HiiLibGetHiiHandles (\r
278 IN OUT UINTN *HandleBufferLength,\r
279 OUT EFI_HII_HANDLE **HiiHandleBuffer\r
7d582d6b 280 )\r
281{\r
e52c5a9f 282 UINTN BufferLength;\r
7d582d6b 283 EFI_STATUS Status;\r
7d582d6b 284\r
e52c5a9f 285 ASSERT (HandleBufferLength != NULL);\r
286 ASSERT (HiiHandleBuffer != NULL);\r
7d582d6b 287\r
e52c5a9f 288 BufferLength = 0;\r
7d582d6b 289\r
54cf8780 290 LocateHiiProtocols ();\r
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
356 LocateHiiProtocols ();\r
357\r
e52c5a9f 358 Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, Handle, &BufferSize, HiiPackageList);\r
359 ASSERT (Status != EFI_NOT_FOUND);\r
360 \r
361 if (Status == EFI_BUFFER_TOO_SMALL) {\r
362 HiiPackageList = AllocatePool (BufferSize);\r
363 ASSERT (HiiPackageList != NULL);\r
7d582d6b 364\r
e52c5a9f 365 Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, Handle, &BufferSize, HiiPackageList);\r
7d582d6b 366 }\r
7d582d6b 367 if (EFI_ERROR (Status)) {\r
b911d09f 368 FreePool (HiiPackageList);\r
7d582d6b 369 return Status;\r
370 }\r
371\r
e52c5a9f 372 //\r
373 // Extract GUID\r
374 //\r
b911d09f 375 CopyGuid (Guid, &HiiPackageList->PackageListGuid);\r
7d582d6b 376\r
29870c8d 377 FreePool (HiiPackageList);\r
7d582d6b 378\r
379 return EFI_SUCCESS;\r
380}\r
381\r
ad1b3619 382/**\r
383 Find HII Handle in the default HII database associated with given Device Path.\r
384\r
385 If DevicePath is NULL, then ASSERT.\r
386\r
387 @param DevicePath Device Path associated with the HII package list\r
388 handle.\r
389\r
390 @retval Handle HII package list Handle associated with the Device\r
391 Path.\r
392 @retval NULL Hii Package list handle is not found.\r
393\r
394**/\r
e52c5a9f 395EFI_HII_HANDLE\r
396EFIAPI\r
397HiiLibDevicePathToHiiHandle (\r
398 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
7d582d6b 399 )\r
7d582d6b 400{\r
e52c5a9f 401 EFI_STATUS Status;\r
402 EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;\r
403 UINTN BufferSize;\r
404 UINTN HandleCount;\r
405 UINTN Index;\r
406 EFI_HANDLE *Handles;\r
407 EFI_HANDLE Handle;\r
408 UINTN Size;\r
409 EFI_HANDLE DriverHandle;\r
410 EFI_HII_HANDLE *HiiHandles;\r
411 EFI_HII_HANDLE HiiHandle;\r
7d582d6b 412\r
e52c5a9f 413 ASSERT (DevicePath != NULL);\r
7d582d6b 414\r
dd51a993 415 //\r
e52c5a9f 416 // Locate Device Path Protocol handle buffer\r
7d582d6b 417 //\r
e52c5a9f 418 Status = gBS->LocateHandleBuffer (\r
419 ByProtocol,\r
420 &gEfiDevicePathProtocolGuid,\r
7d582d6b 421 NULL,\r
e52c5a9f 422 &HandleCount,\r
423 &Handles\r
7d582d6b 424 );\r
425 if (EFI_ERROR (Status)) {\r
e52c5a9f 426 return NULL;\r
7d582d6b 427 }\r
428\r
429 //\r
e52c5a9f 430 // Search Driver Handle by Device Path\r
7d582d6b 431 //\r
e52c5a9f 432 DriverHandle = NULL;\r
433 BufferSize = GetDevicePathSize (DevicePath);\r
434 for(Index = 0; Index < HandleCount; Index++) {\r
435 Handle = Handles[Index];\r
436 gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **) &TmpDevicePath);\r
437\r
438 //\r
439 // Check whether DevicePath match\r
440 //\r
441 Size = GetDevicePathSize (TmpDevicePath);\r
442 if ((Size == BufferSize) && CompareMem (DevicePath, TmpDevicePath, Size) == 0) {\r
443 DriverHandle = Handle;\r
444 break;\r
445 }\r
7d582d6b 446 }\r
29870c8d 447 FreePool (Handles);\r
e52c5a9f 448\r
449 if (DriverHandle == NULL) {\r
450 return NULL;\r
7d582d6b 451 }\r
452\r
54cf8780 453 LocateHiiProtocols ();\r
454\r
bad46384 455 //\r
e52c5a9f 456 // Retrieve all Hii Handles from HII database\r
7d582d6b 457 //\r
e52c5a9f 458 BufferSize = 0x1000;\r
459 HiiHandles = AllocatePool (BufferSize);\r
460 ASSERT (HiiHandles != NULL);\r
461 Status = mHiiDatabaseProt->ListPackageLists (\r
462 mHiiDatabaseProt,\r
463 EFI_HII_PACKAGE_TYPE_ALL,\r
464 NULL,\r
465 &BufferSize,\r
466 HiiHandles\r
467 );\r
468 if (Status == EFI_BUFFER_TOO_SMALL) {\r
29870c8d 469 FreePool (HiiHandles);\r
e52c5a9f 470 HiiHandles = AllocatePool (BufferSize);\r
471 ASSERT (HiiHandles != NULL);\r
472\r
473 Status = mHiiDatabaseProt->ListPackageLists (\r
474 mHiiDatabaseProt,\r
475 EFI_HII_PACKAGE_TYPE_ALL,\r
476 NULL,\r
477 &BufferSize,\r
478 HiiHandles\r
479 );\r
480 }\r
7d582d6b 481\r
e52c5a9f 482 if (EFI_ERROR (Status)) {\r
29870c8d 483 FreePool (HiiHandles);\r
e52c5a9f 484 return NULL;\r
485 }\r
7d582d6b 486\r
e52c5a9f 487 //\r
488 // Search Hii Handle by Driver Handle\r
489 //\r
490 HiiHandle = NULL;\r
491 HandleCount = BufferSize / sizeof (EFI_HII_HANDLE);\r
492 for (Index = 0; Index < HandleCount; Index++) {\r
493 Status = mHiiDatabaseProt->GetPackageListHandle (\r
494 mHiiDatabaseProt,\r
495 HiiHandles[Index],\r
496 &Handle\r
497 );\r
498 if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {\r
499 HiiHandle = HiiHandles[Index];\r
500 break;\r
7d582d6b 501 }\r
7d582d6b 502 }\r
503\r
29870c8d 504 FreePool (HiiHandles);\r
e52c5a9f 505 return HiiHandle;\r
506}\r
7d582d6b 507\r
55a9663b 508/**\r
509 Exports the contents of one or all package lists in the HII database into a buffer.\r
510\r
511 If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database, \r
512 then ASSERT.\r
513 If PackageListHeader is NULL, then ASSERT.\r
514 If PackageListSize is NULL, then ASSERT.\r
515\r
516 @param Handle The HII Handle.\r
517 @param PackageListHeader A pointer to a buffer that will contain the results of \r
518 the export function.\r
519 @param PackageListSize On output, the length of the buffer that is required for the exported data.\r
520\r
521 @retval EFI_SUCCESS Package exported.\r
522\r
523 @retval EFI_OUT_OF_RESOURCES Not enought memory to complete the operations.\r
524\r
525**/\r
526EFI_STATUS \r
527EFIAPI\r
528HiiLibExportPackageLists (\r
529 IN EFI_HII_HANDLE Handle,\r
530 OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader,\r
531 OUT UINTN *PackageListSize\r
532 )\r
533{\r
534 EFI_STATUS Status;\r
535 UINTN Size;\r
536 EFI_HII_PACKAGE_LIST_HEADER *PackageListHdr;\r
537\r
538 ASSERT (PackageListSize != NULL);\r
539 ASSERT (PackageListHeader != NULL);\r
540\r
541 LocateHiiProtocols ();\r
542\r
543 if (Handle != NULL) {\r
544 ASSERT (IsHiiHandleRegistered (Handle));\r
545 }\r
546\r
547 Size = 0;\r
548 PackageListHdr = NULL;\r
549 Status = mHiiDatabaseProt->ExportPackageLists (\r
550 mHiiDatabaseProt,\r
551 Handle,\r
552 &Size,\r
553 PackageListHdr\r
554 );\r
555 ASSERT_EFI_ERROR (Status != EFI_BUFFER_TOO_SMALL);\r
556 \r
557 if (Status == EFI_BUFFER_TOO_SMALL) {\r
558 PackageListHdr = AllocateZeroPool (Size);\r
559 \r
560 if (PackageListHeader == NULL) {\r
561 return EFI_OUT_OF_RESOURCES;\r
562 } else {\r
563 Status = mHiiDatabaseProt->ExportPackageLists (\r
564 mHiiDatabaseProt,\r
565 Handle,\r
566 &Size,\r
567 PackageListHdr\r
568 );\r
569 }\r
570 }\r
571\r
572 if (!EFI_ERROR (Status)) {\r
573 *PackageListHeader = PackageListHdr;\r
574 *PackageListSize = Size;\r
575 } else {\r
576 FreePool (PackageListHdr);\r
577 }\r
578\r
579 return Status;\r
580}\r
581\r
582\r
583EFI_STATUS\r
584EFIAPI\r
585HiiLibListPackageLists (\r
586 IN UINT8 PackageType,\r
587 IN CONST EFI_GUID *PackageGuid,\r
588 IN OUT UINTN *HandleBufferLength,\r
589 OUT EFI_HII_HANDLE **HandleBuffer\r
590 )\r
591{\r
592 EFI_STATUS Status;\r
593 \r
594 ASSERT (HandleBufferLength != NULL);\r
595 ASSERT (HandleBuffer != NULL);\r
596 \r
597 *HandleBufferLength = 0;\r
598 *HandleBuffer = NULL;\r
599\r
600 LocateHiiProtocols ();\r
601\r
602 Status = mHiiDatabaseProt->ListPackageLists (\r
603 mHiiDatabaseProt,\r
604 PackageType,\r
605 PackageGuid,\r
606 HandleBufferLength,\r
607 *HandleBuffer\r
608 );\r
609 if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
610 //\r
611 // No packages is registered to UEFI HII Database, just return EFI_SUCCESS.\r
612 // \r
613 //\r
614 return Status;\r
615 }\r
616\r
617 *HandleBuffer = AllocateZeroPool (*HandleBufferLength);\r
618 \r
619 if (*HandleBuffer == NULL) {\r
620 return EFI_OUT_OF_RESOURCES;\r
621 }\r
622 \r
623 return mHiiDatabaseProt->ListPackageLists (\r
624 mHiiDatabaseProt,\r
625 PackageType,\r
626 PackageGuid,\r
627 HandleBufferLength,\r
628 *HandleBuffer\r
629 );\r
630 \r
631}\r
ad1b3619 632/**\r
633 This function check if the Hii Handle is a valid handle registered\r
634 in the HII database.\r
635\r
636 @param HiiHandle The HII Handle.\r
637\r
638 @retval TRUE If it is a valid HII handle.\r
639 @retval FALSE If it is a invalid HII handle.\r
640**/\r
e52c5a9f 641BOOLEAN\r
642IsHiiHandleRegistered (\r
643 EFI_HII_HANDLE HiiHandle\r
644 )\r
645{\r
646 EFI_STATUS Status;\r
647 UINTN BufferSize;\r
648 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
649\r
650 ASSERT (HiiHandle != NULL);\r
651\r
652 HiiPackageList = NULL;\r
653 BufferSize = 0;\r
54cf8780 654\r
655 LocateHiiProtocols ();\r
656\r
e52c5a9f 657 Status = mHiiDatabaseProt->ExportPackageLists (\r
658 mHiiDatabaseProt,\r
659 HiiHandle,\r
660 &BufferSize,\r
661 HiiPackageList\r
662 );\r
663\r
664 return (BOOLEAN) (Status == EFI_BUFFER_TOO_SMALL);\r
dd51a993 665}\r
7d582d6b 666\r