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
;
26 ExtendedIfrSupportLib's constructor. It locates the required protocol:
27 gEfiHiiDatabaseProtocolGuid and gEfiHiiStringProtocolGuid.
29 @param ImageHandle The firmware allocated handle for the EFI image.
31 @param SystemTable A pointer to the EFI System Table.
33 @retval EFI_SUCCESS This function always completes successfully.
38 ExtendedIfrSupportLibConstructor (
39 IN EFI_HANDLE ImageHandle
,
40 IN EFI_SYSTEM_TABLE
*SystemTable
45 Status
= gBS
->LocateProtocol (&gEfiHiiDatabaseProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiDatabase
);
46 ASSERT_EFI_ERROR (Status
);
48 Status
= gBS
->LocateProtocol (&gEfiHiiStringProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiString
);
49 ASSERT_EFI_ERROR (Status
);
56 Extract formset class for given HII handle.
59 @param Handle The HII handle.
60 @param Class Class of the formset.
61 @param FormSetTitle Formset title string.
62 @param FormSetHelp Formset help string.
64 @retval EFI_SUCCESS Successfully extract Class for specified Hii handle.
65 @return Other values if failed to export packages for the given HII handle.
70 IfrLibExtractClassFromHiiHandle (
71 IN EFI_HII_HANDLE Handle
,
73 OUT EFI_STRING_ID
*FormSetTitle
,
74 OUT EFI_STRING_ID
*FormSetHelp
79 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
84 UINT32 PackageListLength
;
85 EFI_HII_PACKAGE_HEADER PackageHeader
;
87 ASSERT (Handle
!= NULL
);
88 ASSERT (Class
!= NULL
);
89 ASSERT (FormSetTitle
!= NULL
);
90 ASSERT (FormSetHelp
!= NULL
);
92 *Class
= EFI_NON_DEVICE_CLASS
;
97 // Get HII PackageList
100 HiiPackageList
= NULL
;
101 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
103 // Handle is a invalid handle. Check if Handle is corrupted.
105 ASSERT (Status
!= EFI_NOT_FOUND
);
107 // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.
109 ASSERT (Status
== EFI_BUFFER_TOO_SMALL
);
111 HiiPackageList
= AllocatePool (BufferSize
);
112 ASSERT (HiiPackageList
!= NULL
);
114 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
115 if (EFI_ERROR (Status
)) {
120 // Get Form package from this HII package List
122 Offset
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
124 PackageListLength
= ReadUnaligned32 (&HiiPackageList
->PackageLength
);
126 while (Offset
< PackageListLength
) {
127 Package
= ((UINT8
*) HiiPackageList
) + Offset
;
128 CopyMem (&PackageHeader
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
130 if (PackageHeader
.Type
== EFI_HII_PACKAGE_FORMS
) {
132 // Search Class Opcode in this Form Package
134 Offset2
= sizeof (EFI_HII_PACKAGE_HEADER
);
135 while (Offset2
< PackageHeader
.Length
) {
136 OpCodeData
= Package
+ Offset2
;
138 if (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_FORM_SET_OP
) {
140 // Find FormSet OpCode
142 CopyMem (FormSetTitle
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->FormSetTitle
, sizeof (EFI_STRING_ID
));
143 CopyMem (FormSetHelp
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Help
, sizeof (EFI_STRING_ID
));
146 if ((((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_GUID_OP
) &&
147 CompareGuid (&gEfiIfrTianoGuid
, (EFI_GUID
*)(OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
))) &&
148 (((EFI_IFR_GUID_CLASS
*) OpCodeData
)->ExtendOpCode
== EFI_IFR_EXTEND_OP_CLASS
)
151 // Find GUIDed Class OpCode
153 CopyMem (Class
, &((EFI_IFR_GUID_CLASS
*) OpCodeData
)->Class
, sizeof (UINT16
));
156 // Till now, we ought to have found the formset Opcode
161 Offset2
+= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
164 if (Offset2
< PackageHeader
.Length
) {
166 // Target formset found
172 Offset
+= PackageHeader
.Length
;
175 FreePool (HiiPackageList
);