]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Variable/RuntimeDxe/VarCheck.c
Vlv2TbltDevicePkg: Add VarCheckLib library mapping
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / VarCheck.c
CommitLineData
efb01a10
SZ
1/** @file\r
2 Implementation functions and structures for var check protocol.\r
3\r
4Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
fa0737a8
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
efb01a10
SZ
8http://opensource.org/licenses/bsd-license.php\r
9\r
fa0737a8 10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
efb01a10
SZ
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "Variable.h"\r
16#include <Library/DevicePathLib.h>\r
17\r
18extern LIST_ENTRY mLockedVariableList;\r
19extern BOOLEAN mEndOfDxe;\r
20extern BOOLEAN mEnableLocking;\r
21\r
22#define VAR_CHECK_HANDLER_TABLE_SIZE 0x8\r
23\r
24UINT32 mNumberOfHandler = 0;\r
25UINT32 mMaxNumberOfHandler = 0;\r
26VAR_CHECK_SET_VARIABLE_CHECK_HANDLER *mHandlerTable = NULL;\r
27\r
28typedef struct {\r
29 LIST_ENTRY Link;\r
30 EFI_GUID Guid;\r
31 VAR_CHECK_VARIABLE_PROPERTY VariableProperty;\r
32 //CHAR16 *Name;\r
33} VAR_CHECK_VARIABLE_ENTRY;\r
34\r
35LIST_ENTRY mVarCheckVariableList = INITIALIZE_LIST_HEAD_VARIABLE (mVarCheckVariableList);\r
36\r
37typedef\r
38EFI_STATUS\r
39(EFIAPI *INTERNAL_VAR_CHECK_FUNCTION) (\r
40 IN VAR_CHECK_VARIABLE_PROPERTY *Propery,\r
41 IN UINTN DataSize,\r
42 IN VOID *Data\r
43 );\r
44\r
45typedef struct {\r
46 CHAR16 *Name;\r
47 VAR_CHECK_VARIABLE_PROPERTY VariableProperty;\r
48 INTERNAL_VAR_CHECK_FUNCTION CheckFunction;\r
49} UEFI_DEFINED_VARIABLE_ENTRY;\r
50\r
efb01a10
SZ
51/**\r
52 Internal check for load option.\r
53\r
54 @param[in] VariablePropery Pointer to variable property.\r
55 @param[in] DataSize Data size.\r
56 @param[in] Data Pointer to data buffer.\r
57\r
58 @retval EFI_SUCCESS The SetVariable check result was success.\r
59 @retval EFI_INVALID_PARAMETER The data buffer is not a valid load option.\r
60\r
61**/\r
62EFI_STATUS\r
63EFIAPI\r
64InternalVarCheckLoadOption (\r
65 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
66 IN UINTN DataSize,\r
67 IN VOID *Data\r
68 )\r
69{\r
4edb1866 70 UINT16 FilePathListLength;\r
efb01a10
SZ
71 CHAR16 *Description;\r
72 EFI_DEVICE_PATH_PROTOCOL *FilePathList;\r
73\r
4edb1866 74 FilePathListLength = *((UINT16 *) ((UINTN) Data + sizeof (UINT32)));\r
efb01a10
SZ
75\r
76 //\r
77 // Check Description\r
78 //\r
4edb1866 79 Description = (CHAR16 *) ((UINTN) Data + sizeof (UINT32) + sizeof (UINT16));\r
efb01a10
SZ
80 while (Description < (CHAR16 *) ((UINTN) Data + DataSize)) {\r
81 if (*Description == L'\0') {\r
82 break;\r
83 }\r
84 Description++;\r
85 }\r
86 if ((UINTN) Description >= ((UINTN) Data + DataSize)) {\r
87 return EFI_INVALID_PARAMETER;\r
88 }\r
89 Description++;\r
90\r
91 //\r
92 // Check FilePathList\r
93 //\r
94 FilePathList = (EFI_DEVICE_PATH_PROTOCOL *) Description;\r
4edb1866 95 if ((UINTN) FilePathList > (MAX_ADDRESS - FilePathListLength)) {\r
efb01a10
SZ
96 return EFI_INVALID_PARAMETER;\r
97 }\r
4edb1866 98 if (((UINTN) FilePathList + FilePathListLength) > ((UINTN) Data + DataSize)) {\r
efb01a10
SZ
99 return EFI_INVALID_PARAMETER;\r
100 }\r
4edb1866 101 if (FilePathListLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {\r
efb01a10
SZ
102 return EFI_INVALID_PARAMETER;\r
103 }\r
4edb1866 104 if (!IsDevicePathValid (FilePathList, FilePathListLength)) {\r
efb01a10
SZ
105 return EFI_INVALID_PARAMETER;\r
106 }\r
107\r
108 return EFI_SUCCESS;\r
109}\r
110\r
111/**\r
112 Internal check for key option.\r
113\r
114 @param[in] VariablePropery Pointer to variable property.\r
115 @param[in] DataSize Data size.\r
116 @param[in] Data Pointer to data buffer.\r
117\r
118 @retval EFI_SUCCESS The SetVariable check result was success.\r
119 @retval EFI_INVALID_PARAMETER The data buffer is not a valid key option.\r
120\r
121**/\r
122EFI_STATUS\r
123EFIAPI\r
124InternalVarCheckKeyOption (\r
125 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
126 IN UINTN DataSize,\r
127 IN VOID *Data\r
128 )\r
129{\r
130 if (((DataSize - sizeof (EFI_KEY_OPTION)) % sizeof (EFI_INPUT_KEY)) != 0) {\r
131 return EFI_INVALID_PARAMETER;\r
132 }\r
133\r
134 return EFI_SUCCESS;\r
135}\r
136\r
137/**\r
138 Internal check for device path.\r
139\r
140 @param[in] VariablePropery Pointer to variable property.\r
141 @param[in] DataSize Data size.\r
142 @param[in] Data Pointer to data buffer.\r
143\r
144 @retval EFI_SUCCESS The SetVariable check result was success.\r
145 @retval EFI_INVALID_PARAMETER The data buffer is not a valid device path.\r
146\r
147**/\r
148EFI_STATUS\r
149EFIAPI\r
150InternalVarCheckDevicePath (\r
151 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
152 IN UINTN DataSize,\r
153 IN VOID *Data\r
154 )\r
155{\r
156 if (!IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL *) Data, DataSize)) {\r
157 return EFI_INVALID_PARAMETER;\r
158 }\r
159 return EFI_SUCCESS;\r
160}\r
161\r
162/**\r
163 Internal check for ASCII string.\r
164\r
165 @param[in] VariablePropery Pointer to variable property.\r
166 @param[in] DataSize Data size.\r
167 @param[in] Data Pointer to data buffer.\r
168\r
169 @retval EFI_SUCCESS The SetVariable check result was success.\r
170 @retval EFI_INVALID_PARAMETER The data buffer is not a Null-terminated ASCII string.\r
171\r
172**/\r
173EFI_STATUS\r
174EFIAPI\r
175InternalVarCheckAsciiString (\r
176 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
177 IN UINTN DataSize,\r
178 IN VOID *Data\r
179 )\r
180{\r
181 CHAR8 *String;\r
182 UINTN Index;\r
183\r
184 String = (CHAR8 *) Data;\r
185 if (String[DataSize - 1] == '\0') {\r
186 return EFI_SUCCESS;\r
187 } else {\r
188 for (Index = 1; Index < DataSize && (String[DataSize - 1 - Index] != '\0'); Index++);\r
189 if (Index == DataSize) {\r
190 return EFI_INVALID_PARAMETER;\r
191 }\r
192 }\r
193 return EFI_SUCCESS;\r
194}\r
195\r
196/**\r
197 Internal check for size array.\r
198\r
199 @param[in] VariablePropery Pointer to variable property.\r
200 @param[in] DataSize Data size.\r
201 @param[in] Data Pointer to data buffer.\r
202\r
203 @retval EFI_SUCCESS The SetVariable check result was success.\r
204 @retval EFI_INVALID_PARAMETER The DataSize is not size array.\r
205\r
206**/\r
207EFI_STATUS\r
208EFIAPI\r
209InternalVarCheckSizeArray (\r
210 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
211 IN UINTN DataSize,\r
212 IN VOID *Data\r
213 )\r
214{\r
215 if ((DataSize % VariablePropery->MinSize) != 0) {\r
216 return EFI_INVALID_PARAMETER;\r
217 }\r
218 return EFI_SUCCESS;\r
219}\r
220\r
221//\r
222// To prevent name collisions with possible future globally defined variables,\r
223// other internal firmware data variables that are not defined here must be\r
224// saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or\r
225// any other GUID defined by the UEFI Specification. Implementations must\r
226// only permit the creation of variables with a UEFI Specification-defined\r
227// VendorGuid when these variables are documented in the UEFI Specification.\r
228//\r
229UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList[] = {\r
230 {\r
231 EFI_LANG_CODES_VARIABLE_NAME,\r
232 {\r
233 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
234 0,\r
235 VARIABLE_ATTRIBUTE_BS_RT,\r
236 1,\r
237 MAX_UINTN\r
238 },\r
239 InternalVarCheckAsciiString\r
240 },\r
241 {\r
242 EFI_LANG_VARIABLE_NAME,\r
243 {\r
244 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
245 0,\r
246 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
247 1,\r
248 MAX_UINTN\r
249 },\r
250 InternalVarCheckAsciiString\r
251 },\r
252 {\r
253 EFI_TIME_OUT_VARIABLE_NAME,\r
254 {\r
255 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
256 0,\r
257 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
258 sizeof (UINT16),\r
259 sizeof (UINT16)\r
260 },\r
261 NULL\r
262 },\r
263 {\r
264 EFI_PLATFORM_LANG_CODES_VARIABLE_NAME,\r
265 {\r
266 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
267 0,\r
268 VARIABLE_ATTRIBUTE_BS_RT,\r
269 1,\r
270 MAX_UINTN\r
271 },\r
272 InternalVarCheckAsciiString\r
273 },\r
274 {\r
275 EFI_PLATFORM_LANG_VARIABLE_NAME,\r
276 {\r
277 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
278 0,\r
279 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
280 1,\r
281 MAX_UINTN\r
282 },\r
283 InternalVarCheckAsciiString\r
284 },\r
285 {\r
286 EFI_CON_IN_VARIABLE_NAME,\r
287 {\r
288 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
289 0,\r
290 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
291 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
292 MAX_UINTN\r
293 },\r
294 InternalVarCheckDevicePath\r
295 },\r
296 {\r
297 EFI_CON_OUT_VARIABLE_NAME,\r
298 {\r
299 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
300 0,\r
301 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
302 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
303 MAX_UINTN\r
304 },\r
305 InternalVarCheckDevicePath\r
306 },\r
307 {\r
308 EFI_ERR_OUT_VARIABLE_NAME,\r
309 {\r
310 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
311 0,\r
312 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
313 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
314 MAX_UINTN\r
315 },\r
316 InternalVarCheckDevicePath\r
317 },\r
318 {\r
319 EFI_CON_IN_DEV_VARIABLE_NAME,\r
320 {\r
321 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
322 0,\r
323 VARIABLE_ATTRIBUTE_BS_RT,\r
324 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
325 MAX_UINTN\r
326 },\r
327 InternalVarCheckDevicePath\r
328 },\r
329 {\r
330 EFI_CON_OUT_DEV_VARIABLE_NAME,\r
331 {\r
332 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
333 0,\r
334 VARIABLE_ATTRIBUTE_BS_RT,\r
335 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
336 MAX_UINTN\r
337 },\r
338 InternalVarCheckDevicePath\r
339 },\r
340 {\r
341 EFI_ERR_OUT_DEV_VARIABLE_NAME,\r
342 {\r
343 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
344 0,\r
345 VARIABLE_ATTRIBUTE_BS_RT,\r
346 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
347 MAX_UINTN\r
348 },\r
349 InternalVarCheckDevicePath\r
350 },\r
351 {\r
352 EFI_BOOT_ORDER_VARIABLE_NAME,\r
353 {\r
354 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
355 0,\r
356 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
357 sizeof (UINT16),\r
358 MAX_UINTN\r
359 },\r
360 InternalVarCheckSizeArray\r
361 },\r
362 {\r
363 EFI_BOOT_NEXT_VARIABLE_NAME,\r
364 {\r
365 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
366 0,\r
367 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
368 sizeof (UINT16),\r
369 sizeof (UINT16)\r
370 },\r
371 NULL\r
372 },\r
373 {\r
374 EFI_BOOT_CURRENT_VARIABLE_NAME,\r
375 {\r
376 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
377 0,\r
378 VARIABLE_ATTRIBUTE_BS_RT,\r
379 sizeof (UINT16),\r
380 sizeof (UINT16)\r
381 },\r
382 NULL\r
383 },\r
384 {\r
385 EFI_BOOT_OPTION_SUPPORT_VARIABLE_NAME,\r
386 {\r
387 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
388 0,\r
389 VARIABLE_ATTRIBUTE_BS_RT,\r
390 sizeof (UINT32),\r
391 sizeof (UINT32)\r
392 },\r
393 NULL\r
394 },\r
395 {\r
396 EFI_DRIVER_ORDER_VARIABLE_NAME,\r
397 {\r
398 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
399 0,\r
400 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
401 sizeof (UINT16),\r
402 MAX_UINTN\r
403 },\r
404 InternalVarCheckSizeArray\r
405 },\r
03e2cad6
SZ
406 {\r
407 EFI_SYS_PREP_ORDER_VARIABLE_NAME,\r
408 {\r
409 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
410 0,\r
411 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
412 sizeof (UINT16),\r
413 MAX_UINTN\r
414 },\r
415 InternalVarCheckSizeArray\r
416 },\r
efb01a10
SZ
417 {\r
418 EFI_HW_ERR_REC_SUPPORT_VARIABLE_NAME,\r
419 {\r
420 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
421 0,\r
422 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
423 sizeof (UINT16),\r
424 sizeof (UINT16)\r
425 },\r
426 NULL\r
427 },\r
428 {\r
429 EFI_SETUP_MODE_NAME,\r
430 {\r
431 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
432 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
433 VARIABLE_ATTRIBUTE_BS_RT,\r
434 sizeof (UINT8),\r
435 sizeof (UINT8)\r
436 },\r
437 NULL\r
438 },\r
439 {\r
440 EFI_KEY_EXCHANGE_KEY_NAME,\r
441 {\r
442 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
443 0,\r
444 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
445 1,\r
446 MAX_UINTN\r
447 },\r
448 NULL\r
449 },\r
450 {\r
451 EFI_PLATFORM_KEY_NAME,\r
452 {\r
453 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
454 0,\r
455 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
456 1,\r
457 MAX_UINTN\r
458 },\r
459 NULL\r
460 },\r
461 {\r
462 EFI_SIGNATURE_SUPPORT_NAME,\r
463 {\r
464 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
465 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
466 VARIABLE_ATTRIBUTE_BS_RT,\r
467 sizeof (EFI_GUID),\r
468 MAX_UINTN\r
469 },\r
470 InternalVarCheckSizeArray\r
471 },\r
472 {\r
473 EFI_SECURE_BOOT_MODE_NAME,\r
474 {\r
475 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
476 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
477 VARIABLE_ATTRIBUTE_BS_RT,\r
478 sizeof (UINT8),\r
479 sizeof (UINT8)\r
480 },\r
481 NULL\r
482 },\r
483 {\r
484 EFI_KEK_DEFAULT_VARIABLE_NAME,\r
485 {\r
486 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
487 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
488 VARIABLE_ATTRIBUTE_BS_RT,\r
489 1,\r
490 MAX_UINTN\r
491 },\r
492 NULL\r
493 },\r
494 {\r
495 EFI_PK_DEFAULT_VARIABLE_NAME,\r
496 {\r
497 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
498 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
499 VARIABLE_ATTRIBUTE_BS_RT,\r
500 1,\r
501 MAX_UINTN\r
502 },\r
503 NULL\r
504 },\r
505 {\r
506 EFI_DB_DEFAULT_VARIABLE_NAME,\r
507 {\r
508 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
509 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
510 VARIABLE_ATTRIBUTE_BS_RT,\r
511 1,\r
512 MAX_UINTN\r
513 },\r
514 NULL\r
515 },\r
516 {\r
517 EFI_DBX_DEFAULT_VARIABLE_NAME,\r
518 {\r
519 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
520 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
521 VARIABLE_ATTRIBUTE_BS_RT,\r
522 1,\r
523 MAX_UINTN\r
524 },\r
525 NULL\r
526 },\r
527 {\r
528 EFI_DBT_DEFAULT_VARIABLE_NAME,\r
529 {\r
530 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
531 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
532 VARIABLE_ATTRIBUTE_BS_RT,\r
533 1,\r
534 MAX_UINTN\r
535 },\r
536 NULL\r
537 },\r
538 {\r
539 EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME,\r
540 {\r
541 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
542 0,\r
543 VARIABLE_ATTRIBUTE_BS_RT,\r
544 sizeof (UINT64),\r
545 sizeof (UINT64)\r
546 },\r
547 NULL\r
548 },\r
549 {\r
550 EFI_OS_INDICATIONS_VARIABLE_NAME,\r
551 {\r
552 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
553 0,\r
554 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
555 sizeof (UINT64),\r
556 sizeof (UINT64)\r
557 },\r
558 NULL\r
559 },\r
560 {\r
561 EFI_VENDOR_KEYS_VARIABLE_NAME,\r
562 {\r
563 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
564 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
565 VARIABLE_ATTRIBUTE_BS_RT,\r
566 sizeof (UINT8),\r
567 sizeof (UINT8)\r
568 },\r
569 NULL\r
570 },\r
571};\r
572UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList2[] = {\r
573 {\r
574 L"Boot####",\r
575 {\r
576 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
577 0,\r
578 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
4edb1866 579 sizeof (UINT32) + sizeof (UINT16),\r
efb01a10
SZ
580 MAX_UINTN\r
581 },\r
582 InternalVarCheckLoadOption\r
583 },\r
584 {\r
585 L"Driver####",\r
03e2cad6
SZ
586 {\r
587 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
588 0,\r
589 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
590 sizeof (UINT32) + sizeof (UINT16),\r
591 MAX_UINTN\r
592 },\r
593 InternalVarCheckLoadOption\r
594 },\r
595 {\r
596 L"SysPrep####",\r
efb01a10
SZ
597 {\r
598 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
599 0,\r
600 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
4edb1866 601 sizeof (UINT32) + sizeof (UINT16),\r
efb01a10
SZ
602 MAX_UINTN\r
603 },\r
604 InternalVarCheckLoadOption\r
605 },\r
606 {\r
607 L"Key####",\r
608 {\r
609 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
610 0,\r
611 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
612 sizeof (EFI_KEY_OPTION),\r
613 sizeof (EFI_KEY_OPTION) + 3 * sizeof (EFI_INPUT_KEY)\r
614 },\r
615 InternalVarCheckKeyOption\r
616 },\r
617};\r
618\r
fa0737a8
SZ
619//\r
620// EFI_IMAGE_SECURITY_DATABASE_GUID\r
621//\r
622UEFI_DEFINED_VARIABLE_ENTRY mImageSecurityVariableList[] = {\r
4edb1866 623 {\r
fa0737a8 624 EFI_IMAGE_SECURITY_DATABASE,\r
4edb1866
SZ
625 {\r
626 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
fa0737a8
SZ
627 0,\r
628 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
629 1,\r
630 MAX_UINTN\r
631 },\r
632 NULL\r
633 },\r
634 {\r
635 EFI_IMAGE_SECURITY_DATABASE1,\r
636 {\r
637 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
638 0,\r
639 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
640 1,\r
641 MAX_UINTN\r
642 },\r
643 NULL\r
644 },\r
645 {\r
646 EFI_IMAGE_SECURITY_DATABASE2,\r
647 {\r
648 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
649 0,\r
650 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
651 1,\r
652 MAX_UINTN\r
653 },\r
654 NULL\r
4edb1866
SZ
655 },\r
656};\r
657\r
efb01a10 658/**\r
fa0737a8
SZ
659 Get UEFI defined global variable or image security database variable property.\r
660 The code will check if variable guid is global variable or image security database guid first.\r
661 If yes, further check if variable name is in mGlobalVariableList, mGlobalVariableList2 or mImageSecurityVariableList.\r
efb01a10
SZ
662\r
663 @param[in] VariableName Pointer to variable name.\r
664 @param[in] VendorGuid Variable Vendor Guid.\r
665 @param[in] WildcardMatch Try wildcard match or not.\r
666 @param[out] VariableProperty Pointer to variable property.\r
667 @param[out] VarCheckFunction Pointer to check function.\r
668\r
fa0737a8
SZ
669 @retval EFI_SUCCESS Variable is not global variable or image security database variable.\r
670 @retval EFI_INVALID_PARAMETER Variable is global variable or image security database variable, but variable name is not in the lists.\r
efb01a10
SZ
671\r
672**/\r
673EFI_STATUS\r
674GetUefiDefinedVariableProperty (\r
675 IN CHAR16 *VariableName,\r
676 IN EFI_GUID *VendorGuid,\r
677 IN BOOLEAN WildcardMatch,\r
678 OUT VAR_CHECK_VARIABLE_PROPERTY **VariableProperty,\r
679 OUT INTERNAL_VAR_CHECK_FUNCTION *VarCheckFunction OPTIONAL\r
680 )\r
681{\r
682 UINTN Index;\r
683 UINTN NameLength;\r
684\r
685 if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid)) {\r
686 //\r
687 // Try list 1, exactly match.\r
688 //\r
689 for (Index = 0; Index < sizeof (mGlobalVariableList)/sizeof (mGlobalVariableList[0]); Index++) {\r
690 if (StrCmp (mGlobalVariableList[Index].Name, VariableName) == 0) {\r
691 if (VarCheckFunction != NULL) {\r
692 *VarCheckFunction = mGlobalVariableList[Index].CheckFunction;\r
693 }\r
694 *VariableProperty = &mGlobalVariableList[Index].VariableProperty;\r
695 return EFI_SUCCESS;\r
696 }\r
697 }\r
698\r
699 //\r
700 // Try list 2.\r
701 //\r
702 NameLength = StrLen (VariableName) - 4;\r
703 for (Index = 0; Index < sizeof (mGlobalVariableList2)/sizeof (mGlobalVariableList2[0]); Index++) {\r
704 if (WildcardMatch) {\r
705 if ((StrLen (VariableName) == StrLen (mGlobalVariableList2[Index].Name)) &&\r
706 (StrnCmp (mGlobalVariableList2[Index].Name, VariableName, NameLength) == 0) &&\r
707 IsHexaDecimalDigitCharacter (VariableName[NameLength]) &&\r
708 IsHexaDecimalDigitCharacter (VariableName[NameLength + 1]) &&\r
709 IsHexaDecimalDigitCharacter (VariableName[NameLength + 2]) &&\r
710 IsHexaDecimalDigitCharacter (VariableName[NameLength + 3])) {\r
711 if (VarCheckFunction != NULL) {\r
712 *VarCheckFunction = mGlobalVariableList2[Index].CheckFunction;\r
713 }\r
714 *VariableProperty = &mGlobalVariableList2[Index].VariableProperty;\r
715 return EFI_SUCCESS;\r
716 }\r
4edb1866
SZ
717 }\r
718 if (StrCmp (mGlobalVariableList2[Index].Name, VariableName) == 0) {\r
719 if (VarCheckFunction != NULL) {\r
720 *VarCheckFunction = mGlobalVariableList2[Index].CheckFunction;\r
efb01a10 721 }\r
4edb1866
SZ
722 *VariableProperty = &mGlobalVariableList2[Index].VariableProperty;\r
723 return EFI_SUCCESS;\r
efb01a10
SZ
724 }\r
725 }\r
726\r
727 //\r
728 // The variable name is not in the lists.\r
729 //\r
730 return EFI_INVALID_PARAMETER;\r
731 }\r
732\r
fa0737a8
SZ
733 if (CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid)) {\r
734 for (Index = 0; Index < sizeof (mImageSecurityVariableList)/sizeof (mImageSecurityVariableList[0]); Index++) {\r
735 if (StrCmp (mImageSecurityVariableList[Index].Name, VariableName) == 0) {\r
736 if (VarCheckFunction != NULL) {\r
737 *VarCheckFunction = mImageSecurityVariableList[Index].CheckFunction;\r
738 }\r
739 *VariableProperty = &mImageSecurityVariableList[Index].VariableProperty;\r
740 return EFI_SUCCESS;\r
741 }\r
4edb1866 742 }\r
fa0737a8
SZ
743\r
744 return EFI_INVALID_PARAMETER;\r
4edb1866
SZ
745 }\r
746\r
fa0737a8
SZ
747 //\r
748 // It is not global variable, image security database variable.\r
749 //\r
750 return EFI_SUCCESS;\r
4edb1866
SZ
751}\r
752\r
efb01a10
SZ
753/**\r
754 Internal SetVariable check.\r
755\r
756 @param[in] VariableName Name of Variable to set.\r
757 @param[in] VendorGuid Variable vendor GUID.\r
758 @param[in] Attributes Attribute value of the variable.\r
759 @param[in] DataSize Size of Data to set.\r
760 @param[in] Data Data pointer.\r
761\r
762 @retval EFI_SUCCESS The SetVariable check result was success.\r
4edb1866 763 @retval EFI_INVALID_PARAMETER An invalid combination of attribute bits, name, and GUID was supplied,\r
efb01a10
SZ
764 or the DataSize exceeds the minimum or maximum allowed,\r
765 or the Data value is not following UEFI spec for UEFI defined variables.\r
766 @retval EFI_WRITE_PROTECTED The variable in question is read-only.\r
767 @retval Others The return status from check handler.\r
768\r
769**/\r
770EFI_STATUS\r
771EFIAPI\r
772InternalVarCheckSetVariableCheck (\r
773 IN CHAR16 *VariableName,\r
774 IN EFI_GUID *VendorGuid,\r
775 IN UINT32 Attributes,\r
776 IN UINTN DataSize,\r
777 IN VOID *Data\r
778 )\r
779{\r
780 EFI_STATUS Status;\r
781 UINTN Index;\r
782 LIST_ENTRY *Link;\r
783 VAR_CHECK_VARIABLE_ENTRY *Entry;\r
784 CHAR16 *Name;\r
785 VAR_CHECK_VARIABLE_PROPERTY *Property;\r
786 INTERNAL_VAR_CHECK_FUNCTION VarCheckFunction;\r
787\r
788 if (!mEndOfDxe) {\r
789 //\r
790 // Only do check after End Of Dxe.\r
791 //\r
792 return EFI_SUCCESS;\r
793 }\r
794\r
795 Property = NULL;\r
4edb1866
SZ
796 VarCheckFunction = NULL;\r
797\r
798 for ( Link = GetFirstNode (&mVarCheckVariableList)\r
799 ; !IsNull (&mVarCheckVariableList, Link)\r
800 ; Link = GetNextNode (&mVarCheckVariableList, Link)\r
801 ) {\r
802 Entry = BASE_CR (Link, VAR_CHECK_VARIABLE_ENTRY, Link);\r
803 Name = (CHAR16 *) ((UINTN) Entry + sizeof (*Entry));\r
804 if (CompareGuid (&Entry->Guid, VendorGuid) && (StrCmp (Name, VariableName) == 0)) {\r
805 Property = &Entry->VariableProperty;\r
806 break;\r
807 }\r
efb01a10 808 }\r
4edb1866
SZ
809 if (Property == NULL) {\r
810 Status = GetUefiDefinedVariableProperty (VariableName, VendorGuid, TRUE, &Property, &VarCheckFunction);\r
811 if (EFI_ERROR (Status)) {\r
3735017c
SZ
812 //\r
813 // To prevent name collisions with possible future globally defined variables,\r
814 // other internal firmware data variables that are not defined here must be\r
815 // saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or\r
816 // any other GUID defined by the UEFI Specification. Implementations must\r
817 // only permit the creation of variables with a UEFI Specification-defined\r
818 // VendorGuid when these variables are documented in the UEFI Specification.\r
819 //\r
fa0737a8 820 DEBUG ((EFI_D_INFO, "Variable Check UEFI defined variable fail %r - %s not in %g namespace\n", Status, VariableName, VendorGuid));\r
4edb1866 821 return Status;\r
efb01a10
SZ
822 }\r
823 }\r
824 if (Property != NULL) {\r
825 if (mEnableLocking && ((Property->Property & VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY) != 0)) {\r
3735017c 826 DEBUG ((EFI_D_INFO, "Variable Check ReadOnly variable fail %r - %g:%s\n", EFI_WRITE_PROTECTED, VendorGuid, VariableName));\r
efb01a10
SZ
827 return EFI_WRITE_PROTECTED;\r
828 }\r
fa0737a8 829 if (!((((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) && (DataSize == 0)) || (Attributes == 0))) {\r
efb01a10 830 //\r
4edb1866 831 // Not to delete variable.\r
efb01a10 832 //\r
3735017c 833 if ((Property->Attributes != 0) && ((Attributes & (~EFI_VARIABLE_APPEND_WRITE)) != Property->Attributes)) {\r
fa0737a8 834 DEBUG ((EFI_D_INFO, "Variable Check Attributes(0x%08x to 0x%08x) fail %r - %g:%s\n", Property->Attributes, Attributes, EFI_INVALID_PARAMETER, VendorGuid, VariableName));\r
4edb1866
SZ
835 return EFI_INVALID_PARAMETER;\r
836 }\r
fa0737a8
SZ
837 if (DataSize != 0) {\r
838 if ((DataSize < Property->MinSize) || (DataSize > Property->MaxSize)) {\r
839 DEBUG ((EFI_D_INFO, "Variable Check DataSize fail(0x%x not in 0x%x - 0x%x) %r - %g:%s\n", DataSize, Property->MinSize, Property->MaxSize, EFI_INVALID_PARAMETER, VendorGuid, VariableName));\r
840 return EFI_INVALID_PARAMETER;\r
841 }\r
842 if (VarCheckFunction != NULL) {\r
843 Status = VarCheckFunction (\r
844 Property,\r
845 DataSize,\r
846 Data\r
847 );\r
848 if (EFI_ERROR (Status)) {\r
849 DEBUG ((EFI_D_INFO, "Internal Variable Check function fail %r - %g:%s\n", Status, VendorGuid, VariableName));\r
850 return Status;\r
851 }\r
4edb1866 852 }\r
efb01a10
SZ
853 }\r
854 }\r
855 }\r
856\r
857 for (Index = 0; Index < mNumberOfHandler; Index++) {\r
858 Status = mHandlerTable[Index] (\r
859 VariableName,\r
860 VendorGuid,\r
861 Attributes,\r
862 DataSize,\r
863 Data\r
864 );\r
865 if (EFI_ERROR (Status)) {\r
fa0737a8 866 DEBUG ((EFI_D_INFO, "Variable Check handler fail %r - %g:%s\n", Status, VendorGuid, VariableName));\r
efb01a10
SZ
867 return Status;\r
868 }\r
869 }\r
870 return EFI_SUCCESS;\r
871}\r
872\r
873/**\r
874 Reallocates more global memory to store the registered handler list.\r
875\r
876 @retval RETURN_SUCCESS Reallocate memory successfully.\r
877 @retval RETURN_OUT_OF_RESOURCES No enough memory to allocate.\r
878\r
879**/\r
880RETURN_STATUS\r
881EFIAPI\r
882ReallocateHandlerTable (\r
883 VOID\r
884 )\r
885{\r
886 VAR_CHECK_SET_VARIABLE_CHECK_HANDLER *HandlerTable;\r
887\r
888 //\r
889 // Reallocate memory for check handler table.\r
890 //\r
891 HandlerTable = ReallocateRuntimePool (\r
fa0737a8
SZ
892 mMaxNumberOfHandler * sizeof (VAR_CHECK_SET_VARIABLE_CHECK_HANDLER),\r
893 (mMaxNumberOfHandler + VAR_CHECK_HANDLER_TABLE_SIZE) * sizeof (VAR_CHECK_SET_VARIABLE_CHECK_HANDLER),\r
efb01a10
SZ
894 mHandlerTable\r
895 );\r
896\r
897 //\r
898 // No enough resource to allocate.\r
899 //\r
900 if (HandlerTable == NULL) {\r
901 return RETURN_OUT_OF_RESOURCES;\r
902 }\r
903\r
904 mHandlerTable = HandlerTable;\r
905 //\r
906 // Increase max handler number.\r
907 //\r
908 mMaxNumberOfHandler = mMaxNumberOfHandler + VAR_CHECK_HANDLER_TABLE_SIZE;\r
909 return RETURN_SUCCESS;\r
910}\r
911\r
912/**\r
913 Register SetVariable check handler.\r
914\r
915 @param[in] Handler Pointer to check handler.\r
916\r
917 @retval EFI_SUCCESS The SetVariable check handler was registered successfully.\r
918 @retval EFI_INVALID_PARAMETER Handler is NULL.\r
919 @retval EFI_ACCESS_DENIED EFI_END_OF_DXE_EVENT_GROUP_GUID or EFI_EVENT_GROUP_READY_TO_BOOT has\r
920 already been signaled.\r
921 @retval EFI_OUT_OF_RESOURCES There is not enough resource for the SetVariable check handler register request.\r
922 @retval EFI_UNSUPPORTED This interface is not implemented.\r
923 For example, it is unsupported in VarCheck protocol if both VarCheck and SmmVarCheck protocols are present.\r
924\r
925**/\r
926EFI_STATUS\r
927EFIAPI\r
928VarCheckRegisterSetVariableCheckHandler (\r
929 IN VAR_CHECK_SET_VARIABLE_CHECK_HANDLER Handler\r
930 )\r
931{\r
932 EFI_STATUS Status;\r
933\r
934 if (Handler == NULL) {\r
935 return EFI_INVALID_PARAMETER;\r
936 }\r
937\r
938 if (mEndOfDxe) {\r
939 return EFI_ACCESS_DENIED;\r
940 }\r
941\r
942 DEBUG ((EFI_D_INFO, "RegisterSetVariableCheckHandler - 0x%x\n", Handler));\r
943\r
fa0737a8
SZ
944 Status = EFI_SUCCESS;\r
945\r
946 AcquireLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
947\r
efb01a10
SZ
948 //\r
949 // Check whether the handler list is enough to store new handler.\r
950 //\r
951 if (mNumberOfHandler == mMaxNumberOfHandler) {\r
952 //\r
953 // Allocate more resources for new handler.\r
954 //\r
955 Status = ReallocateHandlerTable();\r
956 if (EFI_ERROR (Status)) {\r
fa0737a8 957 goto Done;\r
efb01a10
SZ
958 }\r
959 }\r
960\r
961 //\r
962 // Register new handler into the handler list.\r
963 //\r
964 mHandlerTable[mNumberOfHandler] = Handler;\r
965 mNumberOfHandler++;\r
966\r
fa0737a8
SZ
967Done:\r
968 ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
969\r
970 return Status;\r
efb01a10
SZ
971}\r
972\r
973/**\r
4edb1866 974 Variable property get function.\r
efb01a10 975\r
4edb1866
SZ
976 @param[in] Name Pointer to the variable name.\r
977 @param[in] Guid Pointer to the vendor GUID.\r
978 @param[in] WildcardMatch Try wildcard match or not.\r
efb01a10
SZ
979\r
980 @return Pointer to the property of variable specified by the Name and Guid.\r
981\r
982**/\r
983VAR_CHECK_VARIABLE_PROPERTY *\r
4edb1866
SZ
984VariablePropertyGetFunction (\r
985 IN CHAR16 *Name,\r
986 IN EFI_GUID *Guid,\r
987 IN BOOLEAN WildcardMatch\r
efb01a10
SZ
988 )\r
989{\r
990 LIST_ENTRY *Link;\r
991 VAR_CHECK_VARIABLE_ENTRY *Entry;\r
992 CHAR16 *VariableName;\r
993 VAR_CHECK_VARIABLE_PROPERTY *Property;\r
994\r
fa0737a8
SZ
995 Property = NULL;\r
996\r
4edb1866
SZ
997 for ( Link = GetFirstNode (&mVarCheckVariableList)\r
998 ; !IsNull (&mVarCheckVariableList, Link)\r
999 ; Link = GetNextNode (&mVarCheckVariableList, Link)\r
1000 ) {\r
1001 Entry = BASE_CR (Link, VAR_CHECK_VARIABLE_ENTRY, Link);\r
1002 VariableName = (CHAR16 *) ((UINTN) Entry + sizeof (*Entry));\r
1003 if (CompareGuid (&Entry->Guid, Guid) && (StrCmp (VariableName, Name) == 0)) {\r
1004 return &Entry->VariableProperty;\r
efb01a10
SZ
1005 }\r
1006 }\r
1007\r
fa0737a8 1008 GetUefiDefinedVariableProperty (Name, Guid, WildcardMatch, &Property, NULL);\r
4edb1866
SZ
1009\r
1010 return Property;\r
efb01a10
SZ
1011}\r
1012\r
fa0737a8
SZ
1013/**\r
1014 Internal variable property set.\r
1015\r
1016 @param[in] Name Pointer to the variable name.\r
1017 @param[in] Guid Pointer to the vendor GUID.\r
1018 @param[in] VariableProperty Pointer to the input variable property.\r
1019\r
1020 @retval EFI_SUCCESS The property of variable specified by the Name and Guid was set successfully.\r
1021 @retval EFI_OUT_OF_RESOURCES There is not enough resource for the variable property set request.\r
1022\r
1023**/\r
1024EFI_STATUS\r
1025EFIAPI\r
1026InternalVarCheckVariablePropertySet (\r
1027 IN CHAR16 *Name,\r
1028 IN EFI_GUID *Guid,\r
1029 IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty\r
1030 )\r
1031{\r
1032 EFI_STATUS Status;\r
1033 VAR_CHECK_VARIABLE_ENTRY *Entry;\r
1034 CHAR16 *VariableName;\r
1035 VAR_CHECK_VARIABLE_PROPERTY *Property;\r
1036\r
1037 Status = EFI_SUCCESS;\r
1038\r
1039 Property = VariablePropertyGetFunction (Name, Guid, FALSE);\r
1040 if (Property != NULL) {\r
1041 CopyMem (Property, VariableProperty, sizeof (*VariableProperty));\r
1042 } else {\r
1043 Entry = AllocateRuntimeZeroPool (sizeof (*Entry) + StrSize (Name));\r
1044 if (Entry == NULL) {\r
1045 Status = EFI_OUT_OF_RESOURCES;\r
1046 goto Done;\r
1047 }\r
1048 VariableName = (CHAR16 *) ((UINTN) Entry + sizeof (*Entry));\r
568a5119 1049 StrCpyS (VariableName, StrSize(Name)/sizeof(CHAR16), Name);\r
fa0737a8
SZ
1050 CopyGuid (&Entry->Guid, Guid);\r
1051 CopyMem (&Entry->VariableProperty, VariableProperty, sizeof (*VariableProperty));\r
1052 InsertTailList (&mVarCheckVariableList, &Entry->Link);\r
1053 }\r
1054\r
1055Done:\r
1056 return Status;\r
1057}\r
1058\r
efb01a10
SZ
1059/**\r
1060 Variable property set.\r
1061\r
1062 @param[in] Name Pointer to the variable name.\r
1063 @param[in] Guid Pointer to the vendor GUID.\r
1064 @param[in] VariableProperty Pointer to the input variable property.\r
1065\r
1066 @retval EFI_SUCCESS The property of variable specified by the Name and Guid was set successfully.\r
1067 @retval EFI_INVALID_PARAMETER Name, Guid or VariableProperty is NULL, or Name is an empty string,\r
1068 or the fields of VariableProperty are not valid.\r
1069 @retval EFI_ACCESS_DENIED EFI_END_OF_DXE_EVENT_GROUP_GUID or EFI_EVENT_GROUP_READY_TO_BOOT has\r
1070 already been signaled.\r
1071 @retval EFI_OUT_OF_RESOURCES There is not enough resource for the variable property set request.\r
1072\r
1073**/\r
1074EFI_STATUS\r
1075EFIAPI\r
1076VarCheckVariablePropertySet (\r
1077 IN CHAR16 *Name,\r
1078 IN EFI_GUID *Guid,\r
1079 IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty\r
1080 )\r
1081{\r
1082 EFI_STATUS Status;\r
efb01a10
SZ
1083\r
1084 if (Name == NULL || Name[0] == 0 || Guid == NULL) {\r
1085 return EFI_INVALID_PARAMETER;\r
1086 }\r
1087\r
1088 if (VariableProperty == NULL) {\r
1089 return EFI_INVALID_PARAMETER;\r
1090 }\r
1091\r
1092 if (VariableProperty->Revision != VAR_CHECK_VARIABLE_PROPERTY_REVISION) {\r
1093 return EFI_INVALID_PARAMETER;\r
1094 }\r
1095\r
1096 if (mEndOfDxe) {\r
1097 return EFI_ACCESS_DENIED;\r
1098 }\r
1099\r
efb01a10
SZ
1100 AcquireLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
1101\r
fa0737a8 1102 Status = InternalVarCheckVariablePropertySet (Name, Guid, VariableProperty);\r
efb01a10 1103\r
efb01a10
SZ
1104 ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
1105\r
1106 return Status;\r
1107}\r
1108\r
1109/**\r
4edb1866 1110 Internal variable property get.\r
efb01a10
SZ
1111\r
1112 @param[in] Name Pointer to the variable name.\r
1113 @param[in] Guid Pointer to the vendor GUID.\r
1114 @param[out] VariableProperty Pointer to the output variable property.\r
1115\r
1116 @retval EFI_SUCCESS The property of variable specified by the Name and Guid was got successfully.\r
efb01a10
SZ
1117 @retval EFI_NOT_FOUND The property of variable specified by the Name and Guid was not found.\r
1118\r
1119**/\r
1120EFI_STATUS\r
1121EFIAPI\r
4edb1866 1122InternalVarCheckVariablePropertyGet (\r
efb01a10
SZ
1123 IN CHAR16 *Name,\r
1124 IN EFI_GUID *Guid,\r
1125 OUT VAR_CHECK_VARIABLE_PROPERTY *VariableProperty\r
1126 )\r
1127{\r
1128 LIST_ENTRY *Link;\r
1129 VARIABLE_ENTRY *Entry;\r
1130 CHAR16 *VariableName;\r
1131 BOOLEAN Found;\r
1132 VAR_CHECK_VARIABLE_PROPERTY *Property;\r
1133\r
efb01a10
SZ
1134 Found = FALSE;\r
1135\r
4edb1866 1136 Property = VariablePropertyGetFunction (Name, Guid, TRUE);\r
efb01a10
SZ
1137 if (Property != NULL) {\r
1138 CopyMem (VariableProperty, Property, sizeof (*VariableProperty));\r
1139 Found = TRUE;\r
1140 }\r
1141\r
1142 for ( Link = GetFirstNode (&mLockedVariableList)\r
1143 ; !IsNull (&mLockedVariableList, Link)\r
1144 ; Link = GetNextNode (&mLockedVariableList, Link)\r
1145 ) {\r
1146 Entry = BASE_CR (Link, VARIABLE_ENTRY, Link);\r
1147 VariableName = (CHAR16 *) ((UINTN) Entry + sizeof (*Entry));\r
1148 if (CompareGuid (&Entry->Guid, Guid) && (StrCmp (VariableName, Name) == 0)) {\r
1149 VariableProperty->Property |= VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY;\r
1150 if (!Found) {\r
1151 VariableProperty->Revision = VAR_CHECK_VARIABLE_PROPERTY_REVISION;\r
1152 Found = TRUE;\r
1153 }\r
1154 }\r
1155 }\r
1156\r
4edb1866
SZ
1157 return (Found ? EFI_SUCCESS : EFI_NOT_FOUND);\r
1158}\r
1159\r
1160/**\r
1161 Variable property get.\r
1162\r
1163 @param[in] Name Pointer to the variable name.\r
1164 @param[in] Guid Pointer to the vendor GUID.\r
1165 @param[out] VariableProperty Pointer to the output variable property.\r
1166\r
1167 @retval EFI_SUCCESS The property of variable specified by the Name and Guid was got successfully.\r
1168 @retval EFI_INVALID_PARAMETER Name, Guid or VariableProperty is NULL, or Name is an empty string.\r
1169 @retval EFI_NOT_FOUND The property of variable specified by the Name and Guid was not found.\r
1170\r
1171**/\r
1172EFI_STATUS\r
1173EFIAPI\r
1174VarCheckVariablePropertyGet (\r
1175 IN CHAR16 *Name,\r
1176 IN EFI_GUID *Guid,\r
1177 OUT VAR_CHECK_VARIABLE_PROPERTY *VariableProperty\r
1178 )\r
1179{\r
1180 EFI_STATUS Status;\r
1181\r
1182 if (Name == NULL || Name[0] == 0 || Guid == NULL) {\r
1183 return EFI_INVALID_PARAMETER;\r
1184 }\r
1185\r
1186 if (VariableProperty == NULL) {\r
1187 return EFI_INVALID_PARAMETER;\r
1188 }\r
1189\r
1190 AcquireLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
1191\r
1192 Status = InternalVarCheckVariablePropertyGet (Name, Guid, VariableProperty);\r
1193\r
efb01a10
SZ
1194 ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
1195\r
4edb1866 1196 return Status;\r
efb01a10
SZ
1197}\r
1198\r