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