]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiLibNullClass.c
MdeModulePkg/UefiBootManagerLib: rebase to ARRAY_SIZE()
[mirror_edk2.git] / MdeModulePkg / Library / VarCheckHiiLib / VarCheckHiiLibNullClass.c
CommitLineData
1241af95
SZ
1/** @file\r
2 Var Check Hii handler.\r
3\r
4Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
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
63 DEBUG ((EFI_D_INFO, "%*a%08X: %-48a *%a*\r\n", Indent, "", Offset, Val, Str));\r
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
97 if ((UINTN) (HiiQuestion->VarOffset + HiiQuestion->StorageWidth) > DataSize) {\r
98 DEBUG ((EFI_D_INFO, "VarCheckHiiQuestion fail: (VarOffset(0x%04x) + StorageWidth(0x%02x)) > Size(0x%x)\n", HiiQuestion->VarOffset, HiiQuestion->StorageWidth, DataSize));\r
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
123 DEBUG ((EFI_D_INFO, "VarCheckHiiQuestion fail: OneOf mismatch (0x%lx)\n", OneData));\r
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
131 DEBUG ((EFI_D_INFO, "VarCheckHiiQuestion fail: CheckBox mismatch (0x%lx)\n", OneData));\r
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
150 DEBUG ((EFI_D_INFO, "VarCheckHiiQuestion fail: Numeric mismatch (0x%lx)\n", OneData));\r
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
158 if ((UINTN) (HiiQuestion->VarOffset + HiiQuestion->StorageWidth * MaxContainers) > DataSize) {\r
159 DEBUG ((EFI_D_INFO, "VarCheckHiiQuestion fail: (VarOffset(0x%04x) + StorageWidth(0x%02x) * MaxContainers(0x%02x)) > Size(0x%x)\n", HiiQuestion->VarOffset, HiiQuestion->StorageWidth, MaxContainers, DataSize));\r
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
188 DEBUG ((EFI_D_INFO, "VarCheckHiiQuestion fail: OrderedList mismatch\n"));\r
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
254 DEBUG ((EFI_D_INFO, "VarCheckHiiVariable - %s:%g with Attributes = 0x%08x Size = 0x%x\n", VariableName, VendorGuid, Attributes, DataSize));\r
255 if (HiiVariable->Attributes != Attributes) {\r
256 DEBUG ((EFI_D_INFO, "VarCheckHiiVariable fail for Attributes - 0x%08x\n", HiiVariable->Attributes));\r
257 return EFI_SECURITY_VIOLATION;\r
258 }\r
259\r
260 if (DataSize == 0) {\r
261 DEBUG ((EFI_D_INFO, "VarCheckHiiVariable - CHECK PASS with DataSize == 0 !\n"));\r
262 return EFI_SUCCESS;\r
263 }\r
264\r
265 if (HiiVariable->Size != DataSize) {\r
266 DEBUG ((EFI_D_INFO, "VarCheckHiiVariable fail for Size - 0x%x\n", HiiVariable->Size));\r
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
285 DEBUG ((EFI_D_INFO, "VarCheckHiiVariable - ALL CHECK PASS!\n"));\r
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
321 for (Index = 0; Index < sizeof (mHiiOpCodeStringTable) / sizeof (mHiiOpCodeStringTable[0]); Index++) {\r
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
346 DEBUG ((EFI_D_INFO, " VAR_CHECK_HII_QUESTION_HEADER\n"));\r
347 DEBUG ((EFI_D_INFO, " OpCode - 0x%02x (%a)\n", HiiQuestion->OpCode, HiiOpCodeToStr (HiiQuestion->OpCode)));\r
348 DEBUG ((EFI_D_INFO, " Length - 0x%02x\n", HiiQuestion->Length));\r
349 DEBUG ((EFI_D_INFO, " VarOffset - 0x%04x\n", HiiQuestion->VarOffset));\r
350 DEBUG ((EFI_D_INFO, " StorageWidth - 0x%02x\n", HiiQuestion->StorageWidth));\r
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
360 DEBUG ((EFI_D_INFO, " OneOfOption - 0x%02x\n", OneValue));\r
361 break;\r
362 case sizeof (UINT16):\r
363 DEBUG ((EFI_D_INFO, " OneOfOption - 0x%04x\n", OneValue));\r
364 break;\r
365 case sizeof (UINT32):\r
366 DEBUG ((EFI_D_INFO, " OneOfOption - 0x%08x\n", OneValue));\r
367 break;\r
368 case sizeof (UINT64):\r
369 DEBUG ((EFI_D_INFO, " OneOfOption - 0x%016lx\n", OneValue));\r
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
393 DEBUG ((EFI_D_INFO, " Minimum - 0x%02x\n", Minimum));\r
394 DEBUG ((EFI_D_INFO, " Maximum - 0x%02x\n", Maximum));\r
395 break;\r
396 case sizeof (UINT16):\r
397 DEBUG ((EFI_D_INFO, " Minimum - 0x%04x\n", Minimum));\r
398 DEBUG ((EFI_D_INFO, " Maximum - 0x%04x\n", Maximum));\r
399 break;\r
400 case sizeof (UINT32):\r
401 DEBUG ((EFI_D_INFO, " Minimum - 0x%08x\n", Minimum));\r
402 DEBUG ((EFI_D_INFO, " Maximum - 0x%08x\n", Maximum));\r
403 break;\r
404 case sizeof (UINT64):\r
405 DEBUG ((EFI_D_INFO, " Minimum - 0x%016lx\n", Minimum));\r
406 DEBUG ((EFI_D_INFO, " Maximum - 0x%016lx\n", Maximum));\r
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
415 DEBUG ((EFI_D_INFO, " MaxContainers - 0x%02x\n", ((VAR_CHECK_HII_QUESTION_ORDEREDLIST *) HiiQuestion)->MaxContainers));\r
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
422 DEBUG ((EFI_D_INFO, " OneOfOption - 0x%02x\n", OneValue));\r
423 break;\r
424 case sizeof (UINT16):\r
425 DEBUG ((EFI_D_INFO, " OneOfOption - 0x%04x\n", OneValue));\r
426 break;\r
427 case sizeof (UINT32):\r
428 DEBUG ((EFI_D_INFO, " OneOfOption - 0x%08x\n", OneValue));\r
429 break;\r
430 case sizeof (UINT64):\r
431 DEBUG ((EFI_D_INFO, " OneOfOption - 0x%016lx\n", OneValue));\r
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
460 DEBUG ((EFI_D_INFO, "VAR_CHECK_HII_VARIABLE_HEADER\n"));\r
461 DEBUG ((EFI_D_INFO, " Revision - 0x%04x\n", HiiVariable->Revision));\r
462 DEBUG ((EFI_D_INFO, " HeaderLength - 0x%04x\n", HiiVariable->HeaderLength));\r
463 DEBUG ((EFI_D_INFO, " Length - 0x%08x\n", HiiVariable->Length));\r
464 DEBUG ((EFI_D_INFO, " OpCode - 0x%02x (%a)\n", HiiVariable->OpCode, HiiOpCodeToStr (HiiVariable->OpCode)));\r
465 DEBUG ((EFI_D_INFO, " Size - 0x%04x\n", HiiVariable->Size));\r
466 DEBUG ((EFI_D_INFO, " Attributes - 0x%08x\n", HiiVariable->Attributes));\r
467 DEBUG ((EFI_D_INFO, " Guid - %g\n", &HiiVariable->Guid));\r
468 DEBUG ((EFI_D_INFO, " Name - %s\n", HiiVariable + 1));\r
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
501 DEBUG ((EFI_D_INFO, "DumpVarCheckHii\n"));\r
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