]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiLibNullClass.c
MdeModulePkg/VarCheckHiiLib: Replace EFI_D_INFO with DEBUG_INFO
[mirror_edk2.git] / MdeModulePkg / Library / VarCheckHiiLib / VarCheckHiiLibNullClass.c
CommitLineData
1241af95
SZ
1/** @file\r
2 Var Check Hii handler.\r
3\r
16f69227 4Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>\r
1241af95
SZ
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "VarCheckHii.h"\r
16\r
17GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mVarCheckHiiHex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};\r
18\r
19/**\r
20 Dump some hexadecimal data.\r
21\r
22 @param[in] Indent How many spaces to indent the output.\r
23 @param[in] Offset The offset of the dump.\r
24 @param[in] DataSize The size in bytes of UserData.\r
25 @param[in] UserData The data to dump.\r
26\r
27**/\r
28VOID\r
29VarCheckHiiInternalDumpHex (\r
30 IN UINTN Indent,\r
31 IN UINTN Offset,\r
32 IN UINTN DataSize,\r
33 IN VOID *UserData\r
34 )\r
35{\r
36 UINT8 *Data;\r
37\r
38 CHAR8 Val[50];\r
39\r
40 CHAR8 Str[20];\r
41\r
42 UINT8 TempByte;\r
43 UINTN Size;\r
44 UINTN Index;\r
45\r
46 Data = UserData;\r
47 while (DataSize != 0) {\r
48 Size = 16;\r
49 if (Size > DataSize) {\r
50 Size = DataSize;\r
51 }\r
52\r
53 for (Index = 0; Index < Size; Index += 1) {\r
54 TempByte = Data[Index];\r
55 Val[Index * 3 + 0] = mVarCheckHiiHex[TempByte >> 4];\r
56 Val[Index * 3 + 1] = mVarCheckHiiHex[TempByte & 0xF];\r
57 Val[Index * 3 + 2] = (CHAR8) ((Index == 7) ? '-' : ' ');\r
58 Str[Index] = (CHAR8) ((TempByte < ' ' || TempByte > 'z') ? '.' : TempByte);\r
59 }\r
60\r
61 Val[Index * 3] = 0;\r
62 Str[Index] = 0;\r
c9a7f343 63 DEBUG ((DEBUG_INFO , "%*a%08X: %-48a *%a*\r\n", Indent, "", Offset, Val, Str));\r
1241af95
SZ
64\r
65 Data += Size;\r
66 Offset += Size;\r
67 DataSize -= Size;\r
68 }\r
69}\r
70\r
71/**\r
72 Var Check Hii Question.\r
73\r
74 @param[in] HiiQuestion Pointer to Hii Question\r
75 @param[in] Data Data pointer.\r
76 @param[in] DataSize Size of Data to set.\r
77\r
78 @retval TRUE Check pass\r
79 @retval FALSE Check fail.\r
80\r
81**/\r
82BOOLEAN\r
83VarCheckHiiQuestion (\r
84 IN VAR_CHECK_HII_QUESTION_HEADER *HiiQuestion,\r
85 IN VOID *Data,\r
86 IN UINTN DataSize\r
87 )\r
88{\r
89 UINT64 OneData;\r
90 UINT64 Minimum;\r
91 UINT64 Maximum;\r
92 UINT64 OneValue;\r
93 UINT8 *Ptr;\r
94 UINT8 Index;\r
95 UINT8 MaxContainers;\r
96\r
16f69227 97 if (((UINT32) HiiQuestion->VarOffset + HiiQuestion->StorageWidth) > DataSize) {\r
c9a7f343 98 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: (VarOffset(0x%04x) + StorageWidth(0x%02x)) > Size(0x%x)\n", HiiQuestion->VarOffset, HiiQuestion->StorageWidth, DataSize));\r
1241af95
SZ
99 return FALSE;\r
100 }\r
101\r
102 OneData = 0;\r
103 CopyMem (&OneData, (UINT8 *) Data + HiiQuestion->VarOffset, HiiQuestion->StorageWidth);\r
104\r
105 switch (HiiQuestion->OpCode) {\r
106 case EFI_IFR_ONE_OF_OP:\r
107 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_ONEOF *) HiiQuestion + 1);\r
108 while ((UINTN) Ptr < (UINTN) HiiQuestion + HiiQuestion->Length) {\r
109 OneValue = 0;\r
110 CopyMem (&OneValue, Ptr, HiiQuestion->StorageWidth);\r
111 if (OneData == OneValue) {\r
112 //\r
113 // Match\r
114 //\r
115 break;\r
116 }\r
117 Ptr += HiiQuestion->StorageWidth;\r
118 }\r
119 if ((UINTN) Ptr >= ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
120 //\r
121 // No match\r
122 //\r
c9a7f343 123 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: OneOf mismatch (0x%lx)\n", OneData));\r
1241af95
SZ
124 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->Length, (UINT8 *) HiiQuestion););\r
125 return FALSE;\r
126 }\r
127 break;\r
128\r
129 case EFI_IFR_CHECKBOX_OP:\r
130 if ((OneData != 0) && (OneData != 1)) {\r
c9a7f343 131 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: CheckBox mismatch (0x%lx)\n", OneData));\r
1241af95
SZ
132 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->Length, (UINT8 *) HiiQuestion););\r
133 return FALSE;\r
134 }\r
135 break;\r
136\r
137 case EFI_IFR_NUMERIC_OP:\r
138 Minimum = 0;\r
139 Maximum = 0;\r
140 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_NUMERIC *) HiiQuestion + 1);\r
141 CopyMem (&Minimum, Ptr, HiiQuestion->StorageWidth);\r
142 Ptr += HiiQuestion->StorageWidth;\r
143 CopyMem (&Maximum, Ptr, HiiQuestion->StorageWidth);\r
144 Ptr += HiiQuestion->StorageWidth;\r
145\r
146 //\r
147 // No need to check Step, because it is ONLY for UI.\r
148 //\r
149 if ((OneData < Minimum) || (OneData > Maximum)) {\r
c9a7f343 150 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: Numeric mismatch (0x%lx)\n", OneData));\r
1241af95
SZ
151 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->Length, (UINT8 *) HiiQuestion););\r
152 return FALSE;\r
153 }\r
154 break;\r
155\r
156 case EFI_IFR_ORDERED_LIST_OP:\r
157 MaxContainers = ((VAR_CHECK_HII_QUESTION_ORDEREDLIST *) HiiQuestion)->MaxContainers;\r
16f69227 158 if (((UINT32) HiiQuestion->VarOffset + HiiQuestion->StorageWidth * MaxContainers) > DataSize) {\r
c9a7f343 159 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: (VarOffset(0x%04x) + StorageWidth(0x%02x) * MaxContainers(0x%02x)) > Size(0x%x)\n", HiiQuestion->VarOffset, HiiQuestion->StorageWidth, MaxContainers, DataSize));\r
1241af95
SZ
160 return FALSE;\r
161 }\r
162 for (Index = 0; Index < MaxContainers; Index++) {\r
163 OneData = 0;\r
164 CopyMem (&OneData, (UINT8 *) Data + HiiQuestion->VarOffset + HiiQuestion->StorageWidth * Index, HiiQuestion->StorageWidth);\r
165 if (OneData == 0) {\r
166 //\r
167 // The value of 0 is used to determine if a particular "slot" in the array is empty.\r
168 //\r
169 continue;\r
170 }\r
171\r
172 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_ORDEREDLIST *) HiiQuestion + 1);\r
173 while ((UINTN) Ptr < ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
174 OneValue = 0;\r
175 CopyMem (&OneValue, Ptr, HiiQuestion->StorageWidth);\r
176 if (OneData == OneValue) {\r
177 //\r
178 // Match\r
179 //\r
180 break;\r
181 }\r
182 Ptr += HiiQuestion->StorageWidth;\r
183 }\r
184 if ((UINTN) Ptr >= ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
185 //\r
186 // No match\r
187 //\r
c9a7f343 188 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: OrderedList mismatch\n"));\r
1241af95
SZ
189 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->StorageWidth * MaxContainers, (UINT8 *) Data + HiiQuestion->VarOffset););\r
190 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->Length, (UINT8 *) HiiQuestion););\r
191 return FALSE;\r
192 }\r
193 }\r
194 break;\r
195\r
196 default:\r
197 ASSERT (FALSE);\r
198 break;\r
199 }\r
200\r
201 return TRUE;\r
202}\r
203\r
204VAR_CHECK_HII_VARIABLE_HEADER *mVarCheckHiiBin = NULL;\r
205UINTN mVarCheckHiiBinSize = 0;\r
206\r
207/**\r
208 SetVariable check handler HII.\r
209\r
210 @param[in] VariableName Name of Variable to set.\r
211 @param[in] VendorGuid Variable vendor GUID.\r
212 @param[in] Attributes Attribute value of the variable.\r
213 @param[in] DataSize Size of Data to set.\r
214 @param[in] Data Data pointer.\r
215\r
216 @retval EFI_SUCCESS The SetVariable check result was success.\r
217 @retval EFI_SECURITY_VIOLATION Check fail.\r
218\r
219**/\r
220EFI_STATUS\r
221EFIAPI\r
222SetVariableCheckHandlerHii (\r
223 IN CHAR16 *VariableName,\r
224 IN EFI_GUID *VendorGuid,\r
225 IN UINT32 Attributes,\r
226 IN UINTN DataSize,\r
227 IN VOID *Data\r
228 )\r
229{\r
230 VAR_CHECK_HII_VARIABLE_HEADER *HiiVariable;\r
231 VAR_CHECK_HII_QUESTION_HEADER *HiiQuestion;\r
232\r
233 if (mVarCheckHiiBin == NULL) {\r
234 return EFI_SUCCESS;\r
235 }\r
236\r
237 if ((((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) && (DataSize == 0)) || (Attributes == 0)) {\r
238 //\r
239 // Do not check delete variable.\r
240 //\r
241 return EFI_SUCCESS;\r
242 }\r
243\r
244 //\r
245 // For Hii Variable header align.\r
246 //\r
247 HiiVariable = (VAR_CHECK_HII_VARIABLE_HEADER *) HEADER_ALIGN (mVarCheckHiiBin);\r
248 while ((UINTN) HiiVariable < ((UINTN) mVarCheckHiiBin + mVarCheckHiiBinSize)) {\r
249 if ((StrCmp ((CHAR16 *) (HiiVariable + 1), VariableName) == 0) &&\r
250 (CompareGuid (&HiiVariable->Guid, VendorGuid))) {\r
251 //\r
252 // Found the Hii Variable that could be used to do check.\r
253 //\r
c9a7f343 254 DEBUG ((DEBUG_INFO , "VarCheckHiiVariable - %s:%g with Attributes = 0x%08x Size = 0x%x\n", VariableName, VendorGuid, Attributes, DataSize));\r
1241af95 255 if (HiiVariable->Attributes != Attributes) {\r
c9a7f343 256 DEBUG ((DEBUG_INFO, "VarCheckHiiVariable fail for Attributes - 0x%08x\n", HiiVariable->Attributes));\r
1241af95
SZ
257 return EFI_SECURITY_VIOLATION;\r
258 }\r
259\r
260 if (DataSize == 0) {\r
c9a7f343 261 DEBUG ((DEBUG_INFO, "VarCheckHiiVariable - CHECK PASS with DataSize == 0 !\n"));\r
1241af95
SZ
262 return EFI_SUCCESS;\r
263 }\r
264\r
265 if (HiiVariable->Size != DataSize) {\r
c9a7f343 266 DEBUG ((DEBUG_INFO, "VarCheckHiiVariable fail for Size - 0x%x\n", HiiVariable->Size));\r
1241af95
SZ
267 return EFI_SECURITY_VIOLATION;\r
268 }\r
269\r
270 //\r
271 // Do the check.\r
272 // For Hii Question header align.\r
273 //\r
274 HiiQuestion = (VAR_CHECK_HII_QUESTION_HEADER *) HEADER_ALIGN (((UINTN) HiiVariable + HiiVariable->HeaderLength));\r
275 while ((UINTN) HiiQuestion < ((UINTN) HiiVariable + HiiVariable->Length)) {\r
276 if (!VarCheckHiiQuestion (HiiQuestion, Data, DataSize)) {\r
277 return EFI_SECURITY_VIOLATION;\r
278 }\r
279 //\r
280 // For Hii Question header align.\r
281 //\r
282 HiiQuestion = (VAR_CHECK_HII_QUESTION_HEADER *) HEADER_ALIGN (((UINTN) HiiQuestion + HiiQuestion->Length));\r
283 }\r
284\r
c9a7f343 285 DEBUG ((DEBUG_INFO, "VarCheckHiiVariable - ALL CHECK PASS!\n"));\r
1241af95
SZ
286 return EFI_SUCCESS;\r
287 }\r
288 //\r
289 // For Hii Variable header align.\r
290 //\r
291 HiiVariable = (VAR_CHECK_HII_VARIABLE_HEADER *) HEADER_ALIGN (((UINTN) HiiVariable + HiiVariable->Length));\r
292 }\r
293\r
294 // Not found, so pass.\r
295 return EFI_SUCCESS;\r
296}\r
297\r
298#ifdef DUMP_VAR_CHECK_HII\r
299GLOBAL_REMOVE_IF_UNREFERENCED VAR_CHECK_HII_OPCODE_STRING mHiiOpCodeStringTable[] = {\r
300 {EFI_IFR_VARSTORE_EFI_OP, "EfiVarStore"},\r
301 {EFI_IFR_ONE_OF_OP, "OneOf"},\r
302 {EFI_IFR_CHECKBOX_OP, "CheckBox"},\r
303 {EFI_IFR_NUMERIC_OP, "Numeric"},\r
304 {EFI_IFR_ORDERED_LIST_OP, "OrderedList"},\r
305};\r
306\r
307/**\r
308 HII opcode to string.\r
309\r
310 @param[in] HiiOpCode Hii OpCode.\r
311\r
312 @return Pointer to string.\r
313\r
314**/\r
315CHAR8 *\r
316HiiOpCodeToStr (\r
317 IN UINT8 HiiOpCode\r
318 )\r
319{\r
320 UINTN Index;\r
fe69b398 321 for (Index = 0; Index < ARRAY_SIZE (mHiiOpCodeStringTable); Index++) {\r
1241af95
SZ
322 if (mHiiOpCodeStringTable[Index].HiiOpCode == HiiOpCode) {\r
323 return mHiiOpCodeStringTable[Index].HiiOpCodeStr;\r
324 }\r
325 }\r
326\r
327 return "<UnknownHiiOpCode>";\r
328}\r
329\r
330/**\r
331 Dump Hii Question.\r
332\r
333 @param[in] HiiQuestion Pointer to Hii Question.\r
334\r
335**/\r
336VOID\r
337DumpHiiQuestion (\r
338 IN VAR_CHECK_HII_QUESTION_HEADER *HiiQuestion\r
339 )\r
340{\r
341 UINT64 Minimum;\r
342 UINT64 Maximum;\r
343 UINT64 OneValue;\r
344 UINT8 *Ptr;\r
345\r
c9a7f343
DB
346 DEBUG ((DEBUG_INFO, " VAR_CHECK_HII_QUESTION_HEADER\n"));\r
347 DEBUG ((DEBUG_INFO, " OpCode - 0x%02x (%a)\n", HiiQuestion->OpCode, HiiOpCodeToStr (HiiQuestion->OpCode)));\r
348 DEBUG ((DEBUG_INFO, " Length - 0x%02x\n", HiiQuestion->Length));\r
349 DEBUG ((DEBUG_INFO, " VarOffset - 0x%04x\n", HiiQuestion->VarOffset));\r
350 DEBUG ((DEBUG_INFO, " StorageWidth - 0x%02x\n", HiiQuestion->StorageWidth));\r
1241af95
SZ
351\r
352 switch (HiiQuestion->OpCode) {\r
353 case EFI_IFR_ONE_OF_OP:\r
354 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_ONEOF *) HiiQuestion + 1);\r
355 while ((UINTN) Ptr < ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
356 OneValue = 0;\r
357 CopyMem (&OneValue, Ptr, HiiQuestion->StorageWidth);\r
358 switch (HiiQuestion->StorageWidth) {\r
359 case sizeof (UINT8):\r
c9a7f343 360 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%02x\n", OneValue));\r
1241af95
SZ
361 break;\r
362 case sizeof (UINT16):\r
c9a7f343 363 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%04x\n", OneValue));\r
1241af95
SZ
364 break;\r
365 case sizeof (UINT32):\r
c9a7f343 366 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%08x\n", OneValue));\r
1241af95
SZ
367 break;\r
368 case sizeof (UINT64):\r
c9a7f343 369 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%016lx\n", OneValue));\r
1241af95
SZ
370 break;\r
371 default:\r
372 ASSERT (FALSE);\r
373 break;\r
374 }\r
375 Ptr += HiiQuestion->StorageWidth;\r
376 }\r
377 break;\r
378\r
379 case EFI_IFR_CHECKBOX_OP:\r
380 break;\r
381\r
382 case EFI_IFR_NUMERIC_OP:\r
383 Minimum = 0;\r
384 Maximum = 0;\r
385 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_NUMERIC *) HiiQuestion + 1);\r
386 CopyMem (&Minimum, Ptr, HiiQuestion->StorageWidth);\r
387 Ptr += HiiQuestion->StorageWidth;\r
388 CopyMem (&Maximum, Ptr, HiiQuestion->StorageWidth);\r
389 Ptr += HiiQuestion->StorageWidth;\r
390\r
391 switch (HiiQuestion->StorageWidth) {\r
392 case sizeof (UINT8):\r
c9a7f343
DB
393 DEBUG ((DEBUG_INFO, " Minimum - 0x%02x\n", Minimum));\r
394 DEBUG ((DEBUG_INFO, " Maximum - 0x%02x\n", Maximum));\r
1241af95
SZ
395 break;\r
396 case sizeof (UINT16):\r
c9a7f343
DB
397 DEBUG ((DEBUG_INFO, " Minimum - 0x%04x\n", Minimum));\r
398 DEBUG ((DEBUG_INFO, " Maximum - 0x%04x\n", Maximum));\r
1241af95
SZ
399 break;\r
400 case sizeof (UINT32):\r
c9a7f343
DB
401 DEBUG ((DEBUG_INFO, " Minimum - 0x%08x\n", Minimum));\r
402 DEBUG ((DEBUG_INFO, " Maximum - 0x%08x\n", Maximum));\r
1241af95
SZ
403 break;\r
404 case sizeof (UINT64):\r
c9a7f343
DB
405 DEBUG ((DEBUG_INFO, " Minimum - 0x%016lx\n", Minimum));\r
406 DEBUG ((DEBUG_INFO, " Maximum - 0x%016lx\n", Maximum));\r
1241af95
SZ
407 break;\r
408 default:\r
409 ASSERT (FALSE);\r
410 break;\r
411 }\r
412 break;\r
413\r
414 case EFI_IFR_ORDERED_LIST_OP:\r
c9a7f343 415 DEBUG ((DEBUG_INFO, " MaxContainers - 0x%02x\n", ((VAR_CHECK_HII_QUESTION_ORDEREDLIST *) HiiQuestion)->MaxContainers));\r
1241af95
SZ
416 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_ORDEREDLIST *) HiiQuestion + 1);\r
417 while ((UINTN) Ptr < ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
418 OneValue = 0;\r
419 CopyMem (&OneValue, Ptr, HiiQuestion->StorageWidth);\r
420 switch (HiiQuestion->StorageWidth) {\r
421 case sizeof (UINT8):\r
c9a7f343 422 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%02x\n", OneValue));\r
1241af95
SZ
423 break;\r
424 case sizeof (UINT16):\r
c9a7f343 425 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%04x\n", OneValue));\r
1241af95
SZ
426 break;\r
427 case sizeof (UINT32):\r
c9a7f343 428 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%08x\n", OneValue));\r
1241af95
SZ
429 break;\r
430 case sizeof (UINT64):\r
c9a7f343 431 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%016lx\n", OneValue));\r
1241af95
SZ
432 break;\r
433 default:\r
434 ASSERT (FALSE);\r
435 break;\r
436 }\r
437 Ptr += HiiQuestion->StorageWidth;\r
438 }\r
439 break;\r
440\r
441 default:\r
442 ASSERT (FALSE);\r
443 break;\r
444 }\r
445}\r
446\r
447/**\r
448 Dump Hii Variable.\r
449\r
450 @param[in] HiiVariable Pointer to Hii Variable.\r
451\r
452**/\r
453VOID\r
454DumpHiiVariable (\r
455 IN VAR_CHECK_HII_VARIABLE_HEADER *HiiVariable\r
456 )\r
457{\r
458 VAR_CHECK_HII_QUESTION_HEADER *HiiQuestion;\r
459\r
c9a7f343
DB
460 DEBUG ((DEBUG_INFO, "VAR_CHECK_HII_VARIABLE_HEADER\n"));\r
461 DEBUG ((DEBUG_INFO, " Revision - 0x%04x\n", HiiVariable->Revision));\r
462 DEBUG ((DEBUG_INFO, " HeaderLength - 0x%04x\n", HiiVariable->HeaderLength));\r
463 DEBUG ((DEBUG_INFO, " Length - 0x%08x\n", HiiVariable->Length));\r
464 DEBUG ((DEBUG_INFO, " OpCode - 0x%02x (%a)\n", HiiVariable->OpCode, HiiOpCodeToStr (HiiVariable->OpCode)));\r
465 DEBUG ((DEBUG_INFO, " Size - 0x%04x\n", HiiVariable->Size));\r
466 DEBUG ((DEBUG_INFO, " Attributes - 0x%08x\n", HiiVariable->Attributes));\r
467 DEBUG ((DEBUG_INFO, " Guid - %g\n", &HiiVariable->Guid));\r
468 DEBUG ((DEBUG_INFO, " Name - %s\n", HiiVariable + 1));\r
1241af95
SZ
469\r
470 //\r
471 // For Hii Question header align.\r
472 //\r
473 HiiQuestion = (VAR_CHECK_HII_QUESTION_HEADER *) HEADER_ALIGN (((UINTN) HiiVariable + HiiVariable->HeaderLength));\r
474 while ((UINTN) HiiQuestion < ((UINTN) HiiVariable + HiiVariable->Length)) {\r
475 //\r
476 // Dump Hii Question related to the Hii Variable.\r
477 //\r
478 DumpHiiQuestion (HiiQuestion);\r
479 //\r
480 // For Hii Question header align.\r
481 //\r
482 HiiQuestion = (VAR_CHECK_HII_QUESTION_HEADER *) HEADER_ALIGN (((UINTN) HiiQuestion + HiiQuestion->Length));\r
483 }\r
484}\r
485\r
486/**\r
487 Dump Var Check HII.\r
488\r
489 @param[in] VarCheckHiiBin Pointer to VarCheckHiiBin.\r
490 @param[in] VarCheckHiiBinSize VarCheckHiiBin size.\r
491\r
492**/\r
493VOID\r
494DumpVarCheckHii (\r
495 IN VOID *VarCheckHiiBin,\r
496 IN UINTN VarCheckHiiBinSize\r
497 )\r
498{\r
499 VAR_CHECK_HII_VARIABLE_HEADER *HiiVariable;\r
500\r
c9a7f343 501 DEBUG ((DEBUG_INFO, "DumpVarCheckHii\n"));\r
1241af95
SZ
502\r
503 //\r
504 // For Hii Variable header align.\r
505 //\r
506 HiiVariable = (VAR_CHECK_HII_VARIABLE_HEADER *) HEADER_ALIGN (VarCheckHiiBin);\r
507 while ((UINTN) HiiVariable < ((UINTN) VarCheckHiiBin + VarCheckHiiBinSize)) {\r
508 DumpHiiVariable (HiiVariable);\r
509 //\r
510 // For Hii Variable header align.\r
511 //\r
512 HiiVariable = (VAR_CHECK_HII_VARIABLE_HEADER *) HEADER_ALIGN (((UINTN) HiiVariable + HiiVariable->Length));\r
513 }\r
514}\r
515#endif\r
516\r
517/**\r
518 Constructor function of VarCheckHiiLib to register var check HII handler.\r
519\r
520 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
521 @param[in] SystemTable A pointer to the EFI System Table.\r
522\r
523 @retval EFI_SUCCESS The constructor executed correctly.\r
524\r
525**/\r
526EFI_STATUS\r
527EFIAPI\r
528VarCheckHiiLibNullClassConstructor (\r
529 IN EFI_HANDLE ImageHandle,\r
530 IN EFI_SYSTEM_TABLE *SystemTable\r
531 )\r
532{\r
533 VarCheckLibRegisterEndOfDxeCallback (VarCheckHiiGen);\r
534 VarCheckLibRegisterAddressPointer ((VOID **) &mVarCheckHiiBin);\r
535 VarCheckLibRegisterSetVariableCheckHandler (SetVariableCheckHandlerHii);\r
536\r
537 return EFI_SUCCESS;\r
538}\r
539\r