]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Library/ExtendedIfrSupportLib/Common.c
Replace CopyMem() which can be replaced by BaseLib's Read/WriteUnalianedXX() as these...
[mirror_edk2.git] / MdeModulePkg / Library / ExtendedIfrSupportLib / Common.c
1 /** @file
2 Common Library Routines to assist handle HII elements.
3
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
9
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.
12
13 **/
14
15 #include "LibraryInternal.h"
16
17
18 //
19 // Hii relative protocols
20 //
21
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;
25
26 /**
27 ExtendedIfrSupportLib's constructor. It locates the required protocol:
28 gEfiHiiDatabaseProtocolGuid and gEfiHiiStringProtocolGuid.
29
30 @param ImageHandle The firmware allocated handle for the EFI image.
31
32 @param SystemTable A pointer to the EFI System Table.
33
34 @retval EFI_SUCCESS This function always completes successfully.
35
36 **/
37 EFI_STATUS
38 EFIAPI
39 ExtendedIfrSupportLibConstructor (
40 IN EFI_HANDLE ImageHandle,
41 IN EFI_SYSTEM_TABLE *SystemTable
42 )
43 {
44 EFI_STATUS Status;
45
46 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &gIfrLibHiiDatabase);
47 ASSERT_EFI_ERROR (Status);
48
49 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &gIfrLibHiiString);
50 ASSERT_EFI_ERROR (Status);
51
52 return EFI_SUCCESS;
53 }
54
55
56 /**
57 Extract formset class for given HII handle.
58
59
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.
64
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.
67
68 **/
69 EFI_STATUS
70 EFIAPI
71 IfrLibExtractClassFromHiiHandle (
72 IN EFI_HII_HANDLE Handle,
73 OUT UINT16 *Class,
74 OUT EFI_STRING_ID *FormSetTitle,
75 OUT EFI_STRING_ID *FormSetHelp
76 )
77 {
78 EFI_STATUS Status;
79 UINTN BufferSize;
80 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
81 UINT8 *Package;
82 UINT8 *OpCodeData;
83 UINT32 Offset;
84 UINT32 Offset2;
85 UINT32 PackageListLength;
86 EFI_HII_PACKAGE_HEADER PackageHeader;
87
88 ASSERT (Handle != NULL);
89 ASSERT (Class != NULL);
90 ASSERT (FormSetTitle != NULL);
91 ASSERT (FormSetHelp != NULL);
92
93 *Class = EFI_NON_DEVICE_CLASS;
94 *FormSetTitle = 0;
95 *FormSetHelp = 0;
96
97 //
98 // Get HII PackageList
99 //
100 BufferSize = 0;
101 HiiPackageList = NULL;
102 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);
103 ASSERT (Status != EFI_NOT_FOUND);
104
105 if (Status == EFI_BUFFER_TOO_SMALL) {
106 HiiPackageList = AllocatePool (BufferSize);
107 ASSERT (HiiPackageList != NULL);
108
109 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);
110 }
111 if (EFI_ERROR (Status)) {
112 return Status;
113 }
114
115 //
116 // Get Form package from this HII package List
117 //
118 Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
119 Offset2 = 0;
120 PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);
121
122 while (Offset < PackageListLength) {
123 Package = ((UINT8 *) HiiPackageList) + Offset;
124 CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
125
126 if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {
127 //
128 // Search Class Opcode in this Form Package
129 //
130 Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);
131 while (Offset2 < PackageHeader.Length) {
132 OpCodeData = Package + Offset2;
133
134 if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {
135 //
136 // Find FormSet OpCode
137 //
138 CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));
139 CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));
140 }
141
142 if ((((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP) &&
143 CompareGuid (&mIfrVendorGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER))) &&
144 (((EFI_IFR_GUID_CLASS *) OpCodeData)->ExtendOpCode == EFI_IFR_EXTEND_OP_CLASS)
145 ) {
146 //
147 // Find GUIDed Class OpCode
148 //
149 CopyMem (Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));
150
151 //
152 // Till now, we ought to have found the formset Opcode
153 //
154 break;
155 }
156
157 Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;
158 }
159
160 if (Offset2 < PackageHeader.Length) {
161 //
162 // Target formset found
163 //
164 break;
165 }
166 }
167
168 Offset += PackageHeader.Length;
169 }
170
171 FreePool (HiiPackageList);
172
173 return EFI_SUCCESS;
174 }
175
176