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