2 Common Library Routines to assist handle HII elements.
4 Copyright (c) 2007 - 2008, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "LibraryInternal.h"
19 // Hii relative protocols
22 EFI_HII_DATABASE_PROTOCOL
*gIfrLibHiiDatabase
;
23 EFI_HII_STRING_PROTOCOL
*gIfrLibHiiString
;
24 GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_GUID mIfrVendorGuid
= EFI_IFR_TIANO_GUID
;
27 ExtendedIfrSupportLib's constructor. It locates the required protocol:
28 gEfiHiiDatabaseProtocolGuid and gEfiHiiStringProtocolGuid.
30 @param ImageHandle The firmware allocated handle for the EFI image.
32 @param SystemTable A pointer to the EFI System Table.
34 @retval EFI_SUCCESS This function always completes successfully.
39 ExtendedIfrSupportLibConstructor (
40 IN EFI_HANDLE ImageHandle
,
41 IN EFI_SYSTEM_TABLE
*SystemTable
46 Status
= gBS
->LocateProtocol (&gEfiHiiDatabaseProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiDatabase
);
47 ASSERT_EFI_ERROR (Status
);
49 Status
= gBS
->LocateProtocol (&gEfiHiiStringProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiString
);
50 ASSERT_EFI_ERROR (Status
);
57 Extract formset class for given HII handle.
60 @param Handle The HII handle.
61 @param Class Class of the formset.
62 @param FormSetTitle Formset title string.
63 @param FormSetHelp Formset help string.
65 @retval EFI_SUCCESS Successfully extract Class for specified Hii handle.
66 @return Other values if failed to export packages for the given HII handle.
71 IfrLibExtractClassFromHiiHandle (
72 IN EFI_HII_HANDLE Handle
,
74 OUT EFI_STRING_ID
*FormSetTitle
,
75 OUT EFI_STRING_ID
*FormSetHelp
80 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
85 UINT32 PackageListLength
;
86 EFI_HII_PACKAGE_HEADER PackageHeader
;
88 ASSERT (Handle
!= NULL
);
89 ASSERT (Class
!= NULL
);
90 ASSERT (FormSetTitle
!= NULL
);
91 ASSERT (FormSetHelp
!= NULL
);
93 *Class
= EFI_NON_DEVICE_CLASS
;
98 // Get HII PackageList
101 HiiPackageList
= NULL
;
102 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
104 // Handle is a invalid handle. Check if Handle is corrupted.
106 ASSERT (Status
!= EFI_NOT_FOUND
);
108 // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.
110 ASSERT (Status
== EFI_BUFFER_TOO_SMALL
);
112 HiiPackageList
= AllocatePool (BufferSize
);
113 ASSERT (HiiPackageList
!= NULL
);
115 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
116 if (EFI_ERROR (Status
)) {
121 // Get Form package from this HII package List
123 Offset
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
125 PackageListLength
= ReadUnaligned32 (&HiiPackageList
->PackageLength
);
127 while (Offset
< PackageListLength
) {
128 Package
= ((UINT8
*) HiiPackageList
) + Offset
;
129 CopyMem (&PackageHeader
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
131 if (PackageHeader
.Type
== EFI_HII_PACKAGE_FORMS
) {
133 // Search Class Opcode in this Form Package
135 Offset2
= sizeof (EFI_HII_PACKAGE_HEADER
);
136 while (Offset2
< PackageHeader
.Length
) {
137 OpCodeData
= Package
+ Offset2
;
139 if (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_FORM_SET_OP
) {
141 // Find FormSet OpCode
143 CopyMem (FormSetTitle
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->FormSetTitle
, sizeof (EFI_STRING_ID
));
144 CopyMem (FormSetHelp
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Help
, sizeof (EFI_STRING_ID
));
147 if ((((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_GUID_OP
) &&
148 CompareGuid (&mIfrVendorGuid
, (EFI_GUID
*)(OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
))) &&
149 (((EFI_IFR_GUID_CLASS
*) OpCodeData
)->ExtendOpCode
== EFI_IFR_EXTEND_OP_CLASS
)
152 // Find GUIDed Class OpCode
154 CopyMem (Class
, &((EFI_IFR_GUID_CLASS
*) OpCodeData
)->Class
, sizeof (UINT16
));
157 // Till now, we ought to have found the formset Opcode
162 Offset2
+= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
165 if (Offset2
< PackageHeader
.Length
) {
167 // Target formset found
173 Offset
+= PackageHeader
.Length
;
176 FreePool (HiiPackageList
);