3 This file contains the keyboard processing code to the HII database.
5 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include "HiiDatabase.h"
18 #include "HiiHandle.h"
19 #include <Library/DebugLib.h>
21 CONST EFI_GUID gZeroGuid
= {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};
22 CONST CHAR16 FrameworkReservedVarstoreName
[] = FRAMEWORK_RESERVED_VARSTORE_NAME
;
26 This function returns a list of the package handles of the
27 specified type that are currently active in the HII database. The
28 pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package
31 If HandleBufferLength is NULL, then ASSERT.
32 If HandleBuffer is NULL, the ASSERT.
33 If PackageType is EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is
35 If PackageType is not EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is not
39 @param PackageType Specifies the package type of the packages
40 to list or EFI_HII_PACKAGE_TYPE_ALL for
41 all packages to be listed.
43 @param PackageGuid If PackageType is
44 EFI_HII_PACKAGE_TYPE_GUID, then this is
45 the pointer to the GUID which must match
47 EFI_HII_PACKAGE_GUID_HEADER. Otherwise, it
50 @param HandleBufferLength On output, the length of the handle buffer
51 that is required for the handles found.
53 @param HandleBuffer On output, an array of EFI_HII_HANDLE instances returned.
54 The caller is responcible to free this pointer allocated.
56 @retval EFI_SUCCESS The matching handles are outputed successfully.
57 HandleBufferLength is updated with the actual length.
58 @retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operation.
59 @retval EFI_NOT_FOUND No matching handle could not be found in database.
65 IN CONST EFI_GUID
*PackageGuid
,
66 IN OUT UINTN
*HandleBufferLength
,
67 OUT EFI_HII_HANDLE
**HandleBuffer
72 ASSERT (HandleBufferLength
!= NULL
);
73 ASSERT (HandleBuffer
!= NULL
);
75 *HandleBufferLength
= 0;
78 if (PackageType
== EFI_HII_PACKAGE_TYPE_GUID
) {
79 ASSERT (PackageGuid
!= NULL
);
81 ASSERT (PackageGuid
== NULL
);
84 Status
= mHiiDatabase
->ListPackageLists (
91 if (EFI_ERROR (Status
) && (Status
!= EFI_BUFFER_TOO_SMALL
)) {
93 // No packages is registered to UEFI HII Database, just return.
99 *HandleBuffer
= AllocateZeroPool (*HandleBufferLength
);
101 if (*HandleBuffer
== NULL
) {
102 return EFI_OUT_OF_RESOURCES
;
105 return mHiiDatabase
->ListPackageLists (
116 Exports the contents of one or all package lists in the HII database into a buffer.
118 If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database,
120 If PackageListHeader is NULL, then ASSERT.
121 If PackageListSize is NULL, then ASSERT.
123 @param Handle The HII Handle.
124 @param PackageListHeader A pointer to a buffer that will contain the results of
126 @param PackageListSize On output, the length of the buffer that is required for the exported data.
128 @retval EFI_SUCCESS Package exported.
130 @retval EFI_OUT_OF_RESOURCES Not enought memory to complete the operations.
136 IN EFI_HII_HANDLE Handle
,
137 OUT EFI_HII_PACKAGE_LIST_HEADER
**PackageListHeader
,
138 OUT UINTN
*PackageListSize
143 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHdr
;
145 ASSERT (PackageListSize
!= NULL
);
146 ASSERT (PackageListHeader
!= NULL
);
149 PackageListHdr
= NULL
;
150 Status
= mHiiDatabase
->ExportPackageLists (
156 ASSERT_EFI_ERROR (Status
!= EFI_BUFFER_TOO_SMALL
);
158 if (Status
== EFI_BUFFER_TOO_SMALL
) {
159 PackageListHdr
= AllocateZeroPool (Size
);
161 if (PackageListHeader
== NULL
) {
162 return EFI_OUT_OF_RESOURCES
;
164 Status
= mHiiDatabase
->ExportPackageLists (
173 if (!EFI_ERROR (Status
)) {
174 *PackageListHeader
= PackageListHdr
;
175 *PackageListSize
= Size
;
177 FreePool (PackageListHdr
);
184 Extract Hii package list GUID for given HII handle.
186 If HiiHandle could not be found in the HII database, then ASSERT.
187 If Guid is NULL, then ASSERT.
189 @param Handle Hii handle
190 @param Guid Package list GUID
192 @retval EFI_SUCCESS Successfully extract GUID from Hii database.
197 ExtractGuidFromHiiHandle (
198 IN EFI_HII_HANDLE Handle
,
204 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
206 ASSERT (Guid
!= NULL
);
207 ASSERT (Handle
!= NULL
);
210 // Get HII PackageList
213 HiiPackageList
= NULL
;
215 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
216 ASSERT (Status
!= EFI_NOT_FOUND
);
218 if (Status
== EFI_BUFFER_TOO_SMALL
) {
219 HiiPackageList
= AllocatePool (BufferSize
);
220 ASSERT (HiiPackageList
!= NULL
);
222 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
224 if (EFI_ERROR (Status
)) {
225 FreePool (HiiPackageList
);
232 CopyGuid (Guid
, &HiiPackageList
->PackageListGuid
);
234 FreePool (HiiPackageList
);
240 Find the corressponding UEFI HII Handle from a Framework HII Handle given.
242 @param Private The HII Thunk Module Private context.
243 @param FwHiiHandle The Framemwork HII Handle.
245 @return NULL If Framework HII Handle is invalid.
246 @return The corresponding UEFI HII Handle.
249 FwHiiHandleToUefiHiiHandle (
250 IN CONST HII_THUNK_PRIVATE_DATA
*Private
,
251 IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle
254 HII_THUNK_CONTEXT
*ThunkContext
;
256 ASSERT (FwHiiHandle
!= (FRAMEWORK_EFI_HII_HANDLE
) 0);
257 ASSERT (Private
!= NULL
);
259 ThunkContext
= FwHiiHandleToThunkContext (Private
, FwHiiHandle
);
261 if (ThunkContext
!= NULL
) {
262 return ThunkContext
->UefiHiiHandle
;
265 return (EFI_HII_HANDLE
) NULL
;
270 Find the corressponding HII Thunk Context from a Framework HII Handle given.
272 @param Private The HII Thunk Module Private context.
273 @param FwHiiHandle The Framemwork HII Handle.
275 @return NULL If Framework HII Handle is invalid.
276 @return The corresponding HII Thunk Context.
279 FwHiiHandleToThunkContext (
280 IN CONST HII_THUNK_PRIVATE_DATA
*Private
,
281 IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle
285 HII_THUNK_CONTEXT
*ThunkContext
;
288 Link
= GetFirstNode (&Private
->ThunkContextListHead
);
290 while (!IsNull (&Private
->ThunkContextListHead
, Link
)) {
291 ThunkContext
= HII_THUNK_CONTEXT_FROM_LINK (Link
);
293 if (FwHiiHandle
== ThunkContext
->FwHiiHandle
) {
297 Link
= GetNextNode (&Private
->ThunkContextListHead
, Link
);
304 Find the corressponding HII Thunk Context from a UEFI HII Handle given.
306 @param Private The HII Thunk Module Private context.
307 @param UefiHiiHandle The UEFI HII Handle.
309 @return NULL If UEFI HII Handle is invalid.
310 @return The corresponding HII Thunk Context.
313 UefiHiiHandleToThunkContext (
314 IN CONST HII_THUNK_PRIVATE_DATA
*Private
,
315 IN EFI_HII_HANDLE UefiHiiHandle
319 HII_THUNK_CONTEXT
*ThunkContext
;
321 Link
= GetFirstNode (&Private
->ThunkContextListHead
);
323 while (!IsNull (&Private
->ThunkContextListHead
, Link
)) {
324 ThunkContext
= HII_THUNK_CONTEXT_FROM_LINK (Link
);
326 if (UefiHiiHandle
== ThunkContext
->UefiHiiHandle
) {
329 Link
= GetNextNode (&Private
->ThunkContextListHead
, Link
);
336 Find the corressponding HII Thunk Context from a Tag GUID.
338 @param Private The HII Thunk Module Private context.
339 @param Guid The Tag GUID.
341 @return NULL No HII Thunk Context matched the Tag GUID.
342 @return The corresponding HII Thunk Context.
345 TagGuidToIfrPackThunkContext (
346 IN CONST HII_THUNK_PRIVATE_DATA
*Private
,
347 IN CONST EFI_GUID
*Guid
351 HII_THUNK_CONTEXT
*ThunkContext
;
353 Link
= GetFirstNode (&Private
->ThunkContextListHead
);
355 while (!IsNull (&Private
->ThunkContextListHead
, Link
)) {
356 ThunkContext
= HII_THUNK_CONTEXT_FROM_LINK (Link
);
358 if (CompareGuid (Guid
, &ThunkContext
->TagGuid
) && (ThunkContext
->IfrPackageCount
!= 0)) {
362 Link
= GetNextNode (&Private
->ThunkContextListHead
, Link
);
370 Clean up the HII Thunk Context for a UEFI HII Handle.
372 @param Private The HII Thunk Module Private context.
373 @param UefiHiiHandle The UEFI HII Handle.
377 DestroyThunkContextForUefiHiiHandle (
378 IN HII_THUNK_PRIVATE_DATA
*Private
,
379 IN EFI_HII_HANDLE UefiHiiHandle
382 HII_THUNK_CONTEXT
*ThunkContext
;
384 ThunkContext
= UefiHiiHandleToThunkContext (Private
, UefiHiiHandle
);
385 ASSERT (ThunkContext
!= NULL
);
387 DestroyThunkContext (ThunkContext
);
392 This function create a HII_THUNK_CONTEXT for the input UEFI HiiHandle
393 that is created when a package list registered by a module calling
394 EFI_HII_DATABASE_PROTOCOL.NewPackageList.
395 This function records the PackageListGuid of EFI_HII_PACKAGE_LIST_HEADER
396 into the TagGuid of the created HII_THUNK_CONTEXT.
398 @param UefiHiiHandle The UEFI HII Handle.
400 @return the new created Hii thunk context.
404 CreateThunkContextForUefiHiiHandle (
405 IN EFI_HII_HANDLE UefiHiiHandle
409 EFI_GUID PackageGuid
;
410 HII_THUNK_CONTEXT
*ThunkContext
;
412 ThunkContext
= AllocateZeroPool (sizeof (*ThunkContext
));
413 ASSERT (ThunkContext
!= NULL
);
415 ThunkContext
->Signature
= HII_THUNK_CONTEXT_SIGNATURE
;
417 Status
= AllocateHiiHandle (&ThunkContext
->FwHiiHandle
);
418 if (EFI_ERROR (Status
)) {
422 ThunkContext
->UefiHiiHandle
= UefiHiiHandle
;
424 Status
= ExtractGuidFromHiiHandle (UefiHiiHandle
, &PackageGuid
);
425 ASSERT_EFI_ERROR (Status
);
427 CopyGuid(&ThunkContext
->TagGuid
, &PackageGuid
);
434 Get the number of HII Package for a Package type.
436 @param PackageListHeader The Package List.
437 @param PackageType The Package Type.
439 @return The number of Package for given type.
442 GetPackageCountByType (
443 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
,
448 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
450 PackageHeader
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageListHeader
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
453 while (PackageHeader
->Type
!= EFI_HII_PACKAGE_END
) {
454 if (PackageHeader
->Type
== PackageType
) {
457 PackageHeader
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHeader
+ PackageHeader
->Length
);
465 Get the Form Package from a Framework Package List.
467 @param Packages Framework Package List.
469 @return The Form Package Header found.
471 EFI_HII_PACKAGE_HEADER
*
473 IN CONST EFI_HII_PACKAGES
*Packages
477 TIANO_AUTOGEN_PACKAGES_HEADER
**TianoAutogenPackageHdrArray
;
479 ASSERT (Packages
!= NULL
);
481 TianoAutogenPackageHdrArray
= (TIANO_AUTOGEN_PACKAGES_HEADER
**) (((UINT8
*) &Packages
->GuidId
) + sizeof (Packages
->GuidId
));
483 for (Index
= 0; Index
< Packages
->NumberOfPackages
; Index
++) {
485 // The current UEFI HII build tool generate a binary in the format defined by
486 // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in
487 // this binary is with same package type. So the returned IfrPackageCount and StringPackageCount
488 // may not be the exact number of valid package number in the binary generated
489 // by HII Build tool.
491 switch (TianoAutogenPackageHdrArray
[Index
]->FrameworkPackageHeader
.Type
) {
493 return &TianoAutogenPackageHdrArray
[Index
]->PackageHeader
;
512 ASSERT if no FormSet Opcode is found.
514 @param Packages Form Framework Package.
515 @param FormSetGuid Return the FormSet Guid.
520 IN EFI_HII_PACKAGE_HEADER
*Package
,
521 OUT EFI_GUID
*FormSetGuid
525 EFI_IFR_OP_HEADER
*OpCode
;
526 EFI_IFR_FORM_SET
*FormSet
;
528 Offset
= sizeof (EFI_HII_PACKAGE_HEADER
);
529 while (Offset
< Package
->Length
) {
530 OpCode
= (EFI_IFR_OP_HEADER
*)((UINT8
*) Package
+ Offset
);
532 switch (OpCode
->OpCode
) {
533 case EFI_IFR_FORM_SET_OP
:
534 FormSet
= (EFI_IFR_FORM_SET
*) OpCode
;
535 CopyGuid (FormSetGuid
, (EFI_GUID
*)(VOID
*)&FormSet
->Guid
);
542 Offset
+= OpCode
->Length
;
546 // A proper IFR must have a formset opcode.
553 Creat a Thunk Context.
555 ASSERT if no FormSet Opcode is found.
557 @param Private The HII Thunk Private Context.
558 @param StringPackageCount The String package count.
559 @param IfrPackageCount The IFR Package count.
561 @return A newly created Thunk Context.
562 @retval NULL No resource to create a new Thunk Context.
566 IN HII_THUNK_PRIVATE_DATA
*Private
,
567 IN UINTN StringPackageCount
,
568 IN UINTN IfrPackageCount
572 HII_THUNK_CONTEXT
*ThunkContext
;
574 ThunkContext
= AllocateZeroPool (sizeof (HII_THUNK_CONTEXT
));
575 ASSERT (ThunkContext
!= NULL
);
577 ThunkContext
->Signature
= HII_THUNK_CONTEXT_SIGNATURE
;
578 ThunkContext
->IfrPackageCount
= IfrPackageCount
;
579 ThunkContext
->StringPackageCount
= StringPackageCount
;
580 Status
= AllocateHiiHandle (&ThunkContext
->FwHiiHandle
);
581 if (EFI_ERROR (Status
)) {
590 Destroy the Thunk Context and free up all resource.
592 @param ThunkContext The HII Thunk Private Context to be freed.
596 DestroyThunkContext (
597 IN HII_THUNK_CONTEXT
*ThunkContext
600 ASSERT (ThunkContext
!= NULL
);
602 FreeHiiHandle (ThunkContext
->FwHiiHandle
);
604 RemoveEntryList (&ThunkContext
->Link
);
606 if (ThunkContext
->FormSet
!= NULL
) {
607 DestroyFormSet (ThunkContext
->FormSet
);
610 FreePool (ThunkContext
);
614 Get the FormSet's Default Varstore ID based on the rule (Descending Priority):
616 1) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID (0x01) is found, Var Store ID is used.
617 2) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID is not found, First Var Store ID is used
618 as the default Var Store ID.
620 @param FormSet The Form Set. The Default Varstore ID is updated if found.
624 GetFormsetDefaultVarstoreId (
625 IN OUT FORM_BROWSER_FORMSET
* FormSet
628 LIST_ENTRY
*StorageList
;
629 FORMSET_STORAGE
*Storage
;
632 // VarStoreId 0 is invalid in UEFI IFR.
634 FormSet
->DefaultVarStoreId
= 0;
635 StorageList
= GetFirstNode (&FormSet
->StorageListHead
);
637 while (!IsNull (&FormSet
->StorageListHead
, StorageList
)) {
638 Storage
= FORMSET_STORAGE_FROM_LINK (StorageList
);
640 DEBUG ((EFI_D_INFO
, "FormSet %g: Found Varstore ID %x Name %s Size 0x%x\n", &FormSet
->Guid
, Storage
->VarStoreId
, Storage
->Name
, Storage
->Size
));
642 if (Storage
->VarStoreId
== FRAMEWORK_RESERVED_VARSTORE_ID
) {
644 // 1) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID (0x01) is found, Var Store ID is used.
646 FormSet
->DefaultVarStoreId
= FRAMEWORK_RESERVED_VARSTORE_ID
;
650 StorageList
= GetNextNode (&FormSet
->StorageListHead
, StorageList
);
653 if (FormSet
->DefaultVarStoreId
!= FRAMEWORK_RESERVED_VARSTORE_ID
) {
656 // 2) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID is not found, First Var Store ID is used
657 // as the default Var Store ID.
659 StorageList
= GetFirstNode (&FormSet
->StorageListHead
);
660 if (!IsNull (&FormSet
->StorageListHead
, StorageList
)) {
661 Storage
= FORMSET_STORAGE_FROM_LINK (StorageList
);
662 FormSet
->DefaultVarStoreId
= Storage
->VarStoreId
;
667 if (FormSet
->DefaultVarStoreId
== 0) {
668 DEBUG ((EFI_D_INFO
, "FormSet %g: No Varstore Found\n", &FormSet
->Guid
));
675 Fetch the Ifr binary data of a FormSet.
677 @param Handle PackageList Handle
678 @param FormSetGuid GUID of a formset. If not specified (NULL or zero
679 GUID), take the first FormSet found in package
681 @param BinaryLength The length of the FormSet IFR binary.
682 @param BinaryData The buffer designed to receive the FormSet.
684 @retval EFI_SUCCESS Buffer filled with the requested FormSet.
685 BufferLength was updated.
686 @retval EFI_INVALID_PARAMETER The handle is unknown.
687 @retval EFI_NOT_FOUND A form or FormSet on the requested handle cannot
688 be found with the requested FormId.
693 IN EFI_HII_HANDLE Handle
,
694 IN OUT EFI_GUID
*FormSetGuid
,
695 OUT UINTN
*BinaryLength
,
696 OUT UINT8
**BinaryData
700 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
706 BOOLEAN ReturnDefault
;
707 UINT32 PackageListLength
;
708 EFI_HII_PACKAGE_HEADER PackageHeader
;
712 ZeroMem (&PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));;
715 // if FormSetGuid is NULL or zero GUID, return first FormSet in the package list
717 if (FormSetGuid
== NULL
|| CompareGuid (FormSetGuid
, &gZeroGuid
)) {
718 ReturnDefault
= TRUE
;
720 ReturnDefault
= FALSE
;
724 // Get HII PackageList
727 HiiPackageList
= NULL
;
728 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
729 if (Status
== EFI_BUFFER_TOO_SMALL
) {
730 HiiPackageList
= AllocatePool (BufferSize
);
731 ASSERT (HiiPackageList
!= NULL
);
733 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
735 if (EFI_ERROR (Status
) || HiiPackageList
== NULL
) {
736 return EFI_NOT_FOUND
;
740 // Get Form package from this HII package List
742 Offset
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
744 CopyMem (&PackageListLength
, &HiiPackageList
->PackageLength
, sizeof (UINT32
));
746 while (Offset
< PackageListLength
) {
747 Package
= ((UINT8
*) HiiPackageList
) + Offset
;
748 CopyMem (&PackageHeader
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
750 if (PackageHeader
.Type
== EFI_HII_PACKAGE_FORMS
) {
752 // Search FormSet in this Form Package
754 Offset2
= sizeof (EFI_HII_PACKAGE_HEADER
);
755 while (Offset2
< PackageHeader
.Length
) {
756 OpCodeData
= Package
+ Offset2
;
758 if (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_FORM_SET_OP
) {
760 // Check whether return default FormSet
767 // FormSet GUID is specified, check it
769 if (CompareGuid (FormSetGuid
, (EFI_GUID
*)(OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
)))) {
774 Offset2
+= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
777 if (Offset2
< PackageHeader
.Length
) {
779 // Target formset found
785 Offset
+= PackageHeader
.Length
;
788 if (Offset
>= PackageListLength
) {
790 // Form package not found in this Package List
792 gBS
->FreePool (HiiPackageList
);
793 return EFI_NOT_FOUND
;
796 if (ReturnDefault
&& FormSetGuid
!= NULL
) {
798 // Return the default FormSet GUID
800 CopyMem (FormSetGuid
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Guid
, sizeof (EFI_GUID
));
804 // To determine the length of a whole FormSet IFR binary, one have to parse all the Opcodes
805 // in this FormSet; So, here just simply copy the data from start of a FormSet to the end
806 // of the Form Package.
808 *BinaryLength
= PackageHeader
.Length
- Offset2
;
809 *BinaryData
= AllocateCopyPool (*BinaryLength
, OpCodeData
);
811 gBS
->FreePool (HiiPackageList
);
813 if (*BinaryData
== NULL
) {
814 return EFI_OUT_OF_RESOURCES
;
821 Initialize the internal data structure of a FormSet.
823 @param Handle PackageList Handle
824 @param FormSetGuid GUID of a formset. If not specified (NULL or zero
825 GUID), take the first FormSet found in package
827 @param FormSet FormSet data structure.
829 @retval EFI_SUCCESS The function completed successfully.
830 @retval EFI_NOT_FOUND The specified FormSet could not be found.
835 IN EFI_HII_HANDLE Handle
,
836 IN OUT EFI_GUID
*FormSetGuid
,
837 OUT FORM_BROWSER_FORMSET
*FormSet
842 Status
= GetIfrBinaryData (Handle
, FormSetGuid
, &FormSet
->IfrBinaryLength
, &FormSet
->IfrBinaryData
);
843 if (EFI_ERROR (Status
)) {
847 FormSet
->HiiHandle
= Handle
;
848 CopyMem (&FormSet
->Guid
, FormSetGuid
, sizeof (EFI_GUID
));
851 // Parse the IFR binary OpCodes
853 Status
= ParseOpCodes (FormSet
);
854 if (EFI_ERROR (Status
)) {
858 GetFormsetDefaultVarstoreId (FormSet
);
863 Parse the Form Package and build a FORM_BROWSER_FORMSET structure.
865 @param UefiHiiHandle PackageList Handle
867 @return A pointer to FORM_BROWSER_FORMSET.
870 FORM_BROWSER_FORMSET
*
872 IN EFI_HII_HANDLE UefiHiiHandle
875 FORM_BROWSER_FORMSET
*FormSet
;
876 EFI_GUID FormSetGuid
;
879 FormSet
= AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET
));
880 ASSERT (FormSet
!= NULL
);
882 CopyGuid (&FormSetGuid
, &gZeroGuid
);
883 Status
= InitializeFormSet (UefiHiiHandle
, &FormSetGuid
, FormSet
);
884 if (EFI_ERROR (Status
)) {