]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdePkg/Library/HiiLib/HiiLib.c
Add IfrLibCreatePopUp2 and HiiLibExportPackageLists.
[mirror_edk2.git] / MdePkg / Library / HiiLib / HiiLib.c
... / ...
CommitLineData
1/** @file\r
2 HII Library implementation that uses DXE protocols and services.\r
3\r
4 Copyright (c) 2006, Intel Corporation<BR>\r
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
9\r
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
12\r
13**/\r
14\r
15#include "InternalHiiLib.h"\r
16\r
17CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabaseProt;\r
18CONST EFI_HII_STRING_PROTOCOL *mHiiStringProt;\r
19BOOLEAN mHiiProtocolsInitialized = FALSE;\r
20\r
21\r
22/**\r
23\r
24 This function locate Hii relative protocols for later usage.\r
25\r
26**/\r
27VOID\r
28LocateHiiProtocols (\r
29 VOID\r
30 )\r
31{\r
32 EFI_STATUS Status;\r
33\r
34 if (mHiiProtocolsInitialized) {\r
35 //\r
36 // Only need to initialize the protocol instance once.\r
37 //\r
38 return;\r
39 }\r
40\r
41 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &mHiiDatabaseProt);\r
42 ASSERT_EFI_ERROR (Status);\r
43\r
44 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &mHiiStringProt);\r
45 ASSERT_EFI_ERROR (Status);\r
46\r
47 mHiiProtocolsInitialized = TRUE;\r
48}\r
49\r
50\r
51\r
52/**\r
53 This funciton build the package list based on the package number,\r
54 the GUID of the package list and the list of pointer which point to\r
55 package header that defined by UEFI VFR compiler and StringGather\r
56 tool.\r
57\r
58 #pragma pack (push, 1)\r
59 typedef struct {\r
60 UINT32 BinaryLength;\r
61 EFI_HII_PACKAGE_HEADER PackageHeader;\r
62 } TIANO_AUTOGEN_PACKAGES_HEADER;\r
63 #pragma pack (pop)\r
64\r
65 If there is not enough resource for the new package list,\r
66 the function will ASSERT.\r
67\r
68 @param NumberOfPackages The number of packages be \r
69 @param GuidId The GUID for the package list to be generated.\r
70 @param Marker The variable argument list. Each entry represent a specific package header that is\r
71 generated by VFR compiler and StrGather tool. The first 4 bytes is a UINT32 value\r
72 that indicate the overall length of the package.\r
73\r
74 @return The pointer to the package list header.\r
75\r
76**/\r
77EFI_HII_PACKAGE_LIST_HEADER *\r
78InternalHiiLibPreparePackages (\r
79 IN UINTN NumberOfPackages,\r
80 IN CONST EFI_GUID *GuidId,\r
81 IN VA_LIST Marker\r
82 )\r
83{\r
84 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
85 UINT8 *PackageListData;\r
86 UINT32 PackageListLength;\r
87 UINT32 PackageLength;\r
88 EFI_HII_PACKAGE_HEADER PackageHeader;\r
89 UINT8 *PackageArray;\r
90 UINTN Index;\r
91 VA_LIST MarkerBackup;\r
92\r
93 PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
94\r
95 MarkerBackup = Marker;\r
96\r
97 //\r
98 // Count the lenth of the final package list.\r
99 //\r
100 for (Index = 0; Index < NumberOfPackages; Index++) {\r
101 CopyMem (&PackageLength, VA_ARG (Marker, VOID *), sizeof (UINT32));\r
102 //\r
103 // Do not count the BinaryLength field.\r
104 //\r
105 PackageListLength += (PackageLength - sizeof (UINT32));\r
106 }\r
107\r
108 //\r
109 // Include the lenght of EFI_HII_PACKAGE_END\r
110 //\r
111 PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER);\r
112 PackageListHeader = AllocateZeroPool (PackageListLength);\r
113 ASSERT (PackageListHeader != NULL);\r
114 \r
115 CopyMem (&PackageListHeader->PackageListGuid, GuidId, sizeof (EFI_GUID));\r
116 PackageListHeader->PackageLength = PackageListLength;\r
117\r
118 PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
119\r
120 Marker = MarkerBackup;\r
121 //\r
122 // Prepare the final package list.\r
123 //\r
124 for (Index = 0; Index < NumberOfPackages; Index++) {\r
125 PackageArray = (UINT8 *) VA_ARG (Marker, VOID *);\r
126 CopyMem (&PackageLength, PackageArray, sizeof (UINT32));\r
127 PackageLength -= sizeof (UINT32);\r
128 PackageArray += sizeof (UINT32);\r
129 CopyMem (PackageListData, PackageArray, PackageLength);\r
130 PackageListData += PackageLength;\r
131 }\r
132\r
133 //\r
134 // Append EFI_HII_PACKAGE_END\r
135 //\r
136 PackageHeader.Type = EFI_HII_PACKAGE_END;\r
137 PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
138 CopyMem (PackageListData, &PackageHeader, PackageHeader.Length);\r
139\r
140 return PackageListHeader;\r
141}\r
142\r
143/**\r
144 Assemble EFI_HII_PACKAGE_LIST according to the passed in packages.\r
145\r
146 If GuidId is NULL, then ASSERT.\r
147 If not enough resource to complete the operation, then ASSERT.\r
148\r
149 @param NumberOfPackages Number of packages.\r
150 @param GuidId Package GUID.\r
151 @param ... Variable argument list for packages to be assembled.\r
152\r
153 @return EFI_HII_PACKAGE_LIST_HEADER Pointer of EFI_HII_PACKAGE_LIST_HEADER. The function will ASSERT if system has\r
154 not enough resource to complete the operation.\r
155\r
156**/\r
157EFI_HII_PACKAGE_LIST_HEADER *\r
158EFIAPI\r
159HiiLibPreparePackageList (\r
160 IN UINTN NumberOfPackages,\r
161 IN CONST EFI_GUID *GuidId,\r
162 ...\r
163 )\r
164{\r
165 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
166 VA_LIST Marker;\r
167\r
168 ASSERT (GuidId != NULL);\r
169\r
170 VA_START (Marker, GuidId);\r
171 PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Marker);\r
172 VA_END (Marker);\r
173\r
174 return PackageListHeader;\r
175}\r
176\r
177\r
178/**\r
179 This function allocates pool for an EFI_HII_PACKAGE_LIST structure\r
180 with additional space that is big enough to host all packages described by the variable \r
181 argument list of package pointers. The allocated structure is initialized using NumberOfPackages, \r
182 GuidId, and the variable length argument list of package pointers.\r
183\r
184 Then, EFI_HII_PACKAGE_LIST will be register to the default System HII Database. The\r
185 Handle to the newly registered Package List is returned throught HiiHandle.\r
186\r
187 If HiiHandle is NULL, then ASSERT.\r
188\r
189 @param NumberOfPackages The number of HII packages to register.\r
190 @param GuidId Package List GUID ID.\r
191 @param DriverHandle Optional. If not NULL, the DriverHandle on which an instance of DEVICE_PATH_PROTOCOL is installed.\r
192 This DriverHandle uniquely defines the device that the added packages are associated with.\r
193 @param HiiHandle On output, the HiiHandle is update with the handle which can be used to retrieve the Package \r
194 List later. If the functions failed to add the package to the default HII database, this value will\r
195 be set to NULL.\r
196 @param ... The variable argument list describing all HII Package.\r
197\r
198 @return EFI_SUCCESS If the packages are successfully added to the default HII database.\r
199 @return EFI_OUT_OF_RESOURCE Not enough resource to complete the operation.\r
200\r
201**/\r
202EFI_STATUS\r
203EFIAPI\r
204HiiLibAddPackages (\r
205 IN UINTN NumberOfPackages,\r
206 IN CONST EFI_GUID *GuidId,\r
207 IN EFI_HANDLE DriverHandle, OPTIONAL\r
208 OUT EFI_HII_HANDLE *HiiHandle,\r
209 ...\r
210 )\r
211{\r
212 VA_LIST Args;\r
213 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
214 EFI_STATUS Status;\r
215\r
216 ASSERT (HiiHandle != NULL);\r
217\r
218 LocateHiiProtocols ();\r
219\r
220 VA_START (Args, HiiHandle);\r
221 PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Args);\r
222\r
223 Status = mHiiDatabaseProt->NewPackageList (mHiiDatabaseProt, PackageListHeader, DriverHandle, HiiHandle);\r
224 if (HiiHandle != NULL) {\r
225 if (EFI_ERROR (Status)) {\r
226 *HiiHandle = NULL;\r
227 }\r
228 }\r
229\r
230 FreePool (PackageListHeader);\r
231 VA_END (Args);\r
232 \r
233 return Status;\r
234}\r
235\r
236/**\r
237 Removes a package list from the default HII database.\r
238\r
239 If HiiHandle is NULL, then ASSERT.\r
240 If HiiHandle is not a valid EFI_HII_HANDLE in the default HII database, then ASSERT.\r
241\r
242 @param HiiHandle The handle that was previously registered to the data base that is requested for removal.\r
243 List later.\r
244\r
245**/\r
246VOID\r
247EFIAPI\r
248HiiLibRemovePackages (\r
249 IN EFI_HII_HANDLE HiiHandle\r
250 )\r
251{\r
252 EFI_STATUS Status;\r
253 ASSERT (IsHiiHandleRegistered (HiiHandle));\r
254\r
255 LocateHiiProtocols ();\r
256\r
257 Status = mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
258 ASSERT_EFI_ERROR (Status);\r
259}\r
260\r
261\r
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
277EFI_STATUS\r
278EFIAPI\r
279HiiLibGetHiiHandles (\r
280 IN OUT UINTN *HandleBufferLength,\r
281 OUT EFI_HII_HANDLE **HiiHandleBuffer\r
282 )\r
283{\r
284 UINTN BufferLength;\r
285 EFI_STATUS Status;\r
286\r
287 ASSERT (HandleBufferLength != NULL);\r
288 ASSERT (HiiHandleBuffer != NULL);\r
289\r
290 BufferLength = 0;\r
291\r
292 LocateHiiProtocols ();\r
293\r
294 //\r
295 // Try to find the actual buffer size for HiiHandle Buffer.\r
296 //\r
297 Status = mHiiDatabaseProt->ListPackageLists (\r
298 mHiiDatabaseProt,\r
299 EFI_HII_PACKAGE_TYPE_ALL,\r
300 NULL,\r
301 &BufferLength,\r
302 *HiiHandleBuffer\r
303 );\r
304\r
305 if (Status == EFI_BUFFER_TOO_SMALL) {\r
306 *HiiHandleBuffer = AllocateZeroPool (BufferLength);\r
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
318 }\r
319\r
320 *HandleBufferLength = BufferLength;\r
321\r
322 return Status;\r
323}\r
324\r
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
337EFI_STATUS\r
338EFIAPI\r
339HiiLibExtractGuidFromHiiHandle (\r
340 IN EFI_HII_HANDLE Handle,\r
341 OUT EFI_GUID *Guid\r
342 )\r
343{\r
344 EFI_STATUS Status;\r
345 UINTN BufferSize;\r
346 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
347\r
348 ASSERT (Guid != NULL);\r
349 ASSERT (IsHiiHandleRegistered (Handle));\r
350\r
351 //\r
352 // Get HII PackageList\r
353 //\r
354 BufferSize = 0;\r
355 HiiPackageList = NULL;\r
356\r
357 LocateHiiProtocols ();\r
358\r
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
365\r
366 Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, Handle, &BufferSize, HiiPackageList);\r
367 }\r
368 if (EFI_ERROR (Status)) {\r
369 return Status;\r
370 }\r
371\r
372 //\r
373 // Extract GUID\r
374 //\r
375 CopyMem (Guid, &HiiPackageList->PackageListGuid, sizeof (EFI_GUID));\r
376\r
377 FreePool (HiiPackageList);\r
378\r
379 return EFI_SUCCESS;\r
380}\r
381\r
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
395EFI_HII_HANDLE\r
396EFIAPI\r
397HiiLibDevicePathToHiiHandle (\r
398 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
399 )\r
400{\r
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
412\r
413 ASSERT (DevicePath != NULL);\r
414\r
415 //\r
416 // Locate Device Path Protocol handle buffer\r
417 //\r
418 Status = gBS->LocateHandleBuffer (\r
419 ByProtocol,\r
420 &gEfiDevicePathProtocolGuid,\r
421 NULL,\r
422 &HandleCount,\r
423 &Handles\r
424 );\r
425 if (EFI_ERROR (Status)) {\r
426 return NULL;\r
427 }\r
428\r
429 //\r
430 // Search Driver Handle by Device Path\r
431 //\r
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
446 }\r
447 FreePool (Handles);\r
448\r
449 if (DriverHandle == NULL) {\r
450 return NULL;\r
451 }\r
452\r
453 LocateHiiProtocols ();\r
454\r
455 //\r
456 // Retrieve all Hii Handles from HII database\r
457 //\r
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
469 FreePool (HiiHandles);\r
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
481\r
482 if (EFI_ERROR (Status)) {\r
483 FreePool (HiiHandles);\r
484 return NULL;\r
485 }\r
486\r
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
501 }\r
502 }\r
503\r
504 FreePool (HiiHandles);\r
505 return HiiHandle;\r
506}\r
507\r
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
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
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
654\r
655 LocateHiiProtocols ();\r
656\r
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
665}\r
666\r