2 Implementation functions and structures for var check protocol.
4 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include <Library/DevicePathLib.h>
18 extern LIST_ENTRY mLockedVariableList
;
19 extern BOOLEAN mEndOfDxe
;
20 extern BOOLEAN mEnableLocking
;
22 #define VAR_CHECK_HANDLER_TABLE_SIZE 0x8
24 UINT32 mNumberOfHandler
= 0;
25 UINT32 mMaxNumberOfHandler
= 0;
26 VAR_CHECK_SET_VARIABLE_CHECK_HANDLER
*mHandlerTable
= NULL
;
31 VAR_CHECK_VARIABLE_PROPERTY VariableProperty
;
33 } VAR_CHECK_VARIABLE_ENTRY
;
35 LIST_ENTRY mVarCheckVariableList
= INITIALIZE_LIST_HEAD_VARIABLE (mVarCheckVariableList
);
39 (EFIAPI
*INTERNAL_VAR_CHECK_FUNCTION
) (
40 IN VAR_CHECK_VARIABLE_PROPERTY
*Propery
,
47 VAR_CHECK_VARIABLE_PROPERTY VariableProperty
;
48 INTERNAL_VAR_CHECK_FUNCTION CheckFunction
;
49 } UEFI_DEFINED_VARIABLE_ENTRY
;
52 Internal check for load option.
54 @param[in] VariablePropery Pointer to variable property.
55 @param[in] DataSize Data size.
56 @param[in] Data Pointer to data buffer.
58 @retval EFI_SUCCESS The SetVariable check result was success.
59 @retval EFI_INVALID_PARAMETER The data buffer is not a valid load option.
64 InternalVarCheckLoadOption (
65 IN VAR_CHECK_VARIABLE_PROPERTY
*VariablePropery
,
70 UINT16 FilePathListLength
;
72 EFI_DEVICE_PATH_PROTOCOL
*FilePathList
;
74 FilePathListLength
= *((UINT16
*) ((UINTN
) Data
+ sizeof (UINT32
)));
79 Description
= (CHAR16
*) ((UINTN
) Data
+ sizeof (UINT32
) + sizeof (UINT16
));
80 while (Description
< (CHAR16
*) ((UINTN
) Data
+ DataSize
)) {
81 if (*Description
== L
'\0') {
86 if ((UINTN
) Description
>= ((UINTN
) Data
+ DataSize
)) {
87 return EFI_INVALID_PARAMETER
;
94 FilePathList
= (EFI_DEVICE_PATH_PROTOCOL
*) Description
;
95 if ((UINTN
) FilePathList
> (MAX_ADDRESS
- FilePathListLength
)) {
96 return EFI_INVALID_PARAMETER
;
98 if (((UINTN
) FilePathList
+ FilePathListLength
) > ((UINTN
) Data
+ DataSize
)) {
99 return EFI_INVALID_PARAMETER
;
101 if (FilePathListLength
< sizeof (EFI_DEVICE_PATH_PROTOCOL
)) {
102 return EFI_INVALID_PARAMETER
;
104 if (!IsDevicePathValid (FilePathList
, FilePathListLength
)) {
105 return EFI_INVALID_PARAMETER
;
112 Internal check for key option.
114 @param[in] VariablePropery Pointer to variable property.
115 @param[in] DataSize Data size.
116 @param[in] Data Pointer to data buffer.
118 @retval EFI_SUCCESS The SetVariable check result was success.
119 @retval EFI_INVALID_PARAMETER The data buffer is not a valid key option.
124 InternalVarCheckKeyOption (
125 IN VAR_CHECK_VARIABLE_PROPERTY
*VariablePropery
,
130 if (((DataSize
- sizeof (EFI_KEY_OPTION
)) % sizeof (EFI_INPUT_KEY
)) != 0) {
131 return EFI_INVALID_PARAMETER
;
138 Internal check for device path.
140 @param[in] VariablePropery Pointer to variable property.
141 @param[in] DataSize Data size.
142 @param[in] Data Pointer to data buffer.
144 @retval EFI_SUCCESS The SetVariable check result was success.
145 @retval EFI_INVALID_PARAMETER The data buffer is not a valid device path.
150 InternalVarCheckDevicePath (
151 IN VAR_CHECK_VARIABLE_PROPERTY
*VariablePropery
,
156 if (!IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL
*) Data
, DataSize
)) {
157 return EFI_INVALID_PARAMETER
;
163 Internal check for ASCII string.
165 @param[in] VariablePropery Pointer to variable property.
166 @param[in] DataSize Data size.
167 @param[in] Data Pointer to data buffer.
169 @retval EFI_SUCCESS The SetVariable check result was success.
170 @retval EFI_INVALID_PARAMETER The data buffer is not a Null-terminated ASCII string.
175 InternalVarCheckAsciiString (
176 IN VAR_CHECK_VARIABLE_PROPERTY
*VariablePropery
,
184 String
= (CHAR8
*) Data
;
185 if (String
[DataSize
- 1] == '\0') {
188 for (Index
= 1; Index
< DataSize
&& (String
[DataSize
- 1 - Index
] != '\0'); Index
++);
189 if (Index
== DataSize
) {
190 return EFI_INVALID_PARAMETER
;
197 Internal check for size array.
199 @param[in] VariablePropery Pointer to variable property.
200 @param[in] DataSize Data size.
201 @param[in] Data Pointer to data buffer.
203 @retval EFI_SUCCESS The SetVariable check result was success.
204 @retval EFI_INVALID_PARAMETER The DataSize is not size array.
209 InternalVarCheckSizeArray (
210 IN VAR_CHECK_VARIABLE_PROPERTY
*VariablePropery
,
215 if ((DataSize
% VariablePropery
->MinSize
) != 0) {
216 return EFI_INVALID_PARAMETER
;
222 // To prevent name collisions with possible future globally defined variables,
223 // other internal firmware data variables that are not defined here must be
224 // saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or
225 // any other GUID defined by the UEFI Specification. Implementations must
226 // only permit the creation of variables with a UEFI Specification-defined
227 // VendorGuid when these variables are documented in the UEFI Specification.
229 UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList
[] = {
231 EFI_LANG_CODES_VARIABLE_NAME
,
233 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
235 VARIABLE_ATTRIBUTE_BS_RT
,
239 InternalVarCheckAsciiString
242 EFI_LANG_VARIABLE_NAME
,
244 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
246 VARIABLE_ATTRIBUTE_NV_BS_RT
,
250 InternalVarCheckAsciiString
253 EFI_TIME_OUT_VARIABLE_NAME
,
255 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
257 VARIABLE_ATTRIBUTE_NV_BS_RT
,
264 EFI_PLATFORM_LANG_CODES_VARIABLE_NAME
,
266 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
268 VARIABLE_ATTRIBUTE_BS_RT
,
272 InternalVarCheckAsciiString
275 EFI_PLATFORM_LANG_VARIABLE_NAME
,
277 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
279 VARIABLE_ATTRIBUTE_NV_BS_RT
,
283 InternalVarCheckAsciiString
286 EFI_CON_IN_VARIABLE_NAME
,
288 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
290 VARIABLE_ATTRIBUTE_NV_BS_RT
,
291 sizeof (EFI_DEVICE_PATH_PROTOCOL
),
294 InternalVarCheckDevicePath
297 EFI_CON_OUT_VARIABLE_NAME
,
299 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
301 VARIABLE_ATTRIBUTE_NV_BS_RT
,
302 sizeof (EFI_DEVICE_PATH_PROTOCOL
),
305 InternalVarCheckDevicePath
308 EFI_ERR_OUT_VARIABLE_NAME
,
310 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
312 VARIABLE_ATTRIBUTE_NV_BS_RT
,
313 sizeof (EFI_DEVICE_PATH_PROTOCOL
),
316 InternalVarCheckDevicePath
319 EFI_CON_IN_DEV_VARIABLE_NAME
,
321 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
323 VARIABLE_ATTRIBUTE_BS_RT
,
324 sizeof (EFI_DEVICE_PATH_PROTOCOL
),
327 InternalVarCheckDevicePath
330 EFI_CON_OUT_DEV_VARIABLE_NAME
,
332 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
334 VARIABLE_ATTRIBUTE_BS_RT
,
335 sizeof (EFI_DEVICE_PATH_PROTOCOL
),
338 InternalVarCheckDevicePath
341 EFI_ERR_OUT_DEV_VARIABLE_NAME
,
343 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
345 VARIABLE_ATTRIBUTE_BS_RT
,
346 sizeof (EFI_DEVICE_PATH_PROTOCOL
),
349 InternalVarCheckDevicePath
352 EFI_BOOT_ORDER_VARIABLE_NAME
,
354 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
356 VARIABLE_ATTRIBUTE_NV_BS_RT
,
360 InternalVarCheckSizeArray
363 EFI_BOOT_NEXT_VARIABLE_NAME
,
365 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
367 VARIABLE_ATTRIBUTE_NV_BS_RT
,
374 EFI_BOOT_CURRENT_VARIABLE_NAME
,
376 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
378 VARIABLE_ATTRIBUTE_BS_RT
,
385 EFI_BOOT_OPTION_SUPPORT_VARIABLE_NAME
,
387 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
389 VARIABLE_ATTRIBUTE_BS_RT
,
396 EFI_DRIVER_ORDER_VARIABLE_NAME
,
398 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
400 VARIABLE_ATTRIBUTE_NV_BS_RT
,
404 InternalVarCheckSizeArray
407 EFI_HW_ERR_REC_SUPPORT_VARIABLE_NAME
,
409 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
411 VARIABLE_ATTRIBUTE_NV_BS_RT
,
420 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
421 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
422 VARIABLE_ATTRIBUTE_BS_RT
,
429 EFI_KEY_EXCHANGE_KEY_NAME
,
431 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
433 VARIABLE_ATTRIBUTE_NV_BS_RT_AT
,
440 EFI_PLATFORM_KEY_NAME
,
442 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
444 VARIABLE_ATTRIBUTE_NV_BS_RT_AT
,
451 EFI_SIGNATURE_SUPPORT_NAME
,
453 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
454 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
455 VARIABLE_ATTRIBUTE_BS_RT
,
459 InternalVarCheckSizeArray
462 EFI_SECURE_BOOT_MODE_NAME
,
464 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
465 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
466 VARIABLE_ATTRIBUTE_BS_RT
,
473 EFI_KEK_DEFAULT_VARIABLE_NAME
,
475 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
476 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
477 VARIABLE_ATTRIBUTE_BS_RT
,
484 EFI_PK_DEFAULT_VARIABLE_NAME
,
486 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
487 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
488 VARIABLE_ATTRIBUTE_BS_RT
,
495 EFI_DB_DEFAULT_VARIABLE_NAME
,
497 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
498 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
499 VARIABLE_ATTRIBUTE_BS_RT
,
506 EFI_DBX_DEFAULT_VARIABLE_NAME
,
508 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
509 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
510 VARIABLE_ATTRIBUTE_BS_RT
,
517 EFI_DBT_DEFAULT_VARIABLE_NAME
,
519 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
520 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
521 VARIABLE_ATTRIBUTE_BS_RT
,
528 EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME
,
530 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
532 VARIABLE_ATTRIBUTE_BS_RT
,
539 EFI_OS_INDICATIONS_VARIABLE_NAME
,
541 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
543 VARIABLE_ATTRIBUTE_NV_BS_RT
,
550 EFI_VENDOR_KEYS_VARIABLE_NAME
,
552 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
553 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
554 VARIABLE_ATTRIBUTE_BS_RT
,
561 UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList2
[] = {
565 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
567 VARIABLE_ATTRIBUTE_NV_BS_RT
,
568 sizeof (UINT32
) + sizeof (UINT16
),
571 InternalVarCheckLoadOption
576 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
578 VARIABLE_ATTRIBUTE_NV_BS_RT
,
579 sizeof (UINT32
) + sizeof (UINT16
),
582 InternalVarCheckLoadOption
587 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
589 VARIABLE_ATTRIBUTE_NV_BS_RT
,
590 sizeof (EFI_KEY_OPTION
),
591 sizeof (EFI_KEY_OPTION
) + 3 * sizeof (EFI_INPUT_KEY
)
593 InternalVarCheckKeyOption
600 VAR_CHECK_VARIABLE_PROPERTY VariableProperty
;
601 } VARIABLE_DRIVER_VARIABLE_ENTRY
;
603 VARIABLE_DRIVER_VARIABLE_ENTRY mVariableDriverVariableList
[] = {
605 &gEdkiiVarErrorFlagGuid
,
608 VAR_CHECK_VARIABLE_PROPERTY_REVISION
,
609 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
,
610 VARIABLE_ATTRIBUTE_NV_BS_RT
,
611 sizeof (VAR_ERROR_FLAG
),
612 sizeof (VAR_ERROR_FLAG
),
618 Get UEFI defined global variable property.
619 The code will check if variable guid is global variable guid first.
620 If yes, further check if variable name is in mGlobalVariableList or mGlobalVariableList2.
622 @param[in] VariableName Pointer to variable name.
623 @param[in] VendorGuid Variable Vendor Guid.
624 @param[in] WildcardMatch Try wildcard match or not.
625 @param[out] VariableProperty Pointer to variable property.
626 @param[out] VarCheckFunction Pointer to check function.
628 @retval EFI_SUCCESS Variable is not global variable.
629 @retval EFI_INVALID_PARAMETER Variable is global variable, but variable name is not in the lists.
633 GetUefiDefinedVariableProperty (
634 IN CHAR16
*VariableName
,
635 IN EFI_GUID
*VendorGuid
,
636 IN BOOLEAN WildcardMatch
,
637 OUT VAR_CHECK_VARIABLE_PROPERTY
**VariableProperty
,
638 OUT INTERNAL_VAR_CHECK_FUNCTION
*VarCheckFunction OPTIONAL
644 if (CompareGuid (VendorGuid
, &gEfiGlobalVariableGuid
)) {
646 // Try list 1, exactly match.
648 for (Index
= 0; Index
< sizeof (mGlobalVariableList
)/sizeof (mGlobalVariableList
[0]); Index
++) {
649 if (StrCmp (mGlobalVariableList
[Index
].Name
, VariableName
) == 0) {
650 if (VarCheckFunction
!= NULL
) {
651 *VarCheckFunction
= mGlobalVariableList
[Index
].CheckFunction
;
653 *VariableProperty
= &mGlobalVariableList
[Index
].VariableProperty
;
661 NameLength
= StrLen (VariableName
) - 4;
662 for (Index
= 0; Index
< sizeof (mGlobalVariableList2
)/sizeof (mGlobalVariableList2
[0]); Index
++) {
664 if ((StrLen (VariableName
) == StrLen (mGlobalVariableList2
[Index
].Name
)) &&
665 (StrnCmp (mGlobalVariableList2
[Index
].Name
, VariableName
, NameLength
) == 0) &&
666 IsHexaDecimalDigitCharacter (VariableName
[NameLength
]) &&
667 IsHexaDecimalDigitCharacter (VariableName
[NameLength
+ 1]) &&
668 IsHexaDecimalDigitCharacter (VariableName
[NameLength
+ 2]) &&
669 IsHexaDecimalDigitCharacter (VariableName
[NameLength
+ 3])) {
670 if (VarCheckFunction
!= NULL
) {
671 *VarCheckFunction
= mGlobalVariableList2
[Index
].CheckFunction
;
673 *VariableProperty
= &mGlobalVariableList2
[Index
].VariableProperty
;
677 if (StrCmp (mGlobalVariableList2
[Index
].Name
, VariableName
) == 0) {
678 if (VarCheckFunction
!= NULL
) {
679 *VarCheckFunction
= mGlobalVariableList2
[Index
].CheckFunction
;
681 *VariableProperty
= &mGlobalVariableList2
[Index
].VariableProperty
;
687 // The variable name is not in the lists.
689 return EFI_INVALID_PARAMETER
;
693 // It is not global variable.
699 Get variable property for variables managed by Varaible driver.
701 @param[in] VariableName Pointer to variable name.
702 @param[in] VendorGuid Variable Vendor Guid.
704 @return Pointer to variable property.
707 VAR_CHECK_VARIABLE_PROPERTY
*
708 GetVariableDriverVariableProperty (
709 IN CHAR16
*VariableName
,
710 IN EFI_GUID
*VendorGuid
715 for (Index
= 0; Index
< sizeof (mVariableDriverVariableList
)/sizeof (mVariableDriverVariableList
[0]); Index
++) {
716 if ((CompareGuid (mVariableDriverVariableList
[Index
].Guid
, VendorGuid
)) && (StrCmp (mVariableDriverVariableList
[Index
].Name
, VariableName
) == 0)) {
717 return &mVariableDriverVariableList
[Index
].VariableProperty
;
725 Internal SetVariable check.
727 @param[in] VariableName Name of Variable to set.
728 @param[in] VendorGuid Variable vendor GUID.
729 @param[in] Attributes Attribute value of the variable.
730 @param[in] DataSize Size of Data to set.
731 @param[in] Data Data pointer.
733 @retval EFI_SUCCESS The SetVariable check result was success.
734 @retval EFI_INVALID_PARAMETER An invalid combination of attribute bits, name, and GUID was supplied,
735 or the DataSize exceeds the minimum or maximum allowed,
736 or the Data value is not following UEFI spec for UEFI defined variables.
737 @retval EFI_WRITE_PROTECTED The variable in question is read-only.
738 @retval Others The return status from check handler.
743 InternalVarCheckSetVariableCheck (
744 IN CHAR16
*VariableName
,
745 IN EFI_GUID
*VendorGuid
,
746 IN UINT32 Attributes
,
754 VAR_CHECK_VARIABLE_ENTRY
*Entry
;
756 VAR_CHECK_VARIABLE_PROPERTY
*Property
;
757 INTERNAL_VAR_CHECK_FUNCTION VarCheckFunction
;
761 // Only do check after End Of Dxe.
767 VarCheckFunction
= NULL
;
769 for ( Link
= GetFirstNode (&mVarCheckVariableList
)
770 ; !IsNull (&mVarCheckVariableList
, Link
)
771 ; Link
= GetNextNode (&mVarCheckVariableList
, Link
)
773 Entry
= BASE_CR (Link
, VAR_CHECK_VARIABLE_ENTRY
, Link
);
774 Name
= (CHAR16
*) ((UINTN
) Entry
+ sizeof (*Entry
));
775 if (CompareGuid (&Entry
->Guid
, VendorGuid
) && (StrCmp (Name
, VariableName
) == 0)) {
776 Property
= &Entry
->VariableProperty
;
780 if (Property
== NULL
) {
781 Property
= GetVariableDriverVariableProperty (VariableName
, VendorGuid
);
783 if (Property
== NULL
) {
784 Status
= GetUefiDefinedVariableProperty (VariableName
, VendorGuid
, TRUE
, &Property
, &VarCheckFunction
);
785 if (EFI_ERROR (Status
)) {
786 DEBUG ((EFI_D_INFO
, "[Variable]: Var Check UEFI defined variable fail %r - %g:%s\n", Status
, VendorGuid
, VariableName
));
790 if (Property
!= NULL
) {
791 if (mEnableLocking
&& ((Property
->Property
& VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
) != 0)) {
792 DEBUG ((EFI_D_INFO
, "[Variable]: Var Check ReadOnly variable fail %r - %g:%s\n", EFI_WRITE_PROTECTED
, VendorGuid
, VariableName
));
793 return EFI_WRITE_PROTECTED
;
795 if (!((DataSize
== 0) || (Attributes
== 0))) {
797 // Not to delete variable.
799 if (Attributes
!= Property
->Attributes
) {
800 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
));
801 return EFI_INVALID_PARAMETER
;
803 if ((DataSize
< Property
->MinSize
) || (DataSize
> Property
->MaxSize
)) {
804 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
));
805 return EFI_INVALID_PARAMETER
;
807 if (VarCheckFunction
!= NULL
) {
808 Status
= VarCheckFunction (
813 if (EFI_ERROR (Status
)) {
814 DEBUG ((EFI_D_INFO
, "[Variable]: Internal Var Check function fail %r - %g:%s\n", Status
, VendorGuid
, VariableName
));
821 for (Index
= 0; Index
< mNumberOfHandler
; Index
++) {
822 Status
= mHandlerTable
[Index
] (
829 if (EFI_ERROR (Status
)) {
830 DEBUG ((EFI_D_INFO
, "[Variable]: Var Check handler fail %r - %g:%s\n", Status
, VendorGuid
, VariableName
));
838 Reallocates more global memory to store the registered handler list.
840 @retval RETURN_SUCCESS Reallocate memory successfully.
841 @retval RETURN_OUT_OF_RESOURCES No enough memory to allocate.
846 ReallocateHandlerTable (
850 VAR_CHECK_SET_VARIABLE_CHECK_HANDLER
*HandlerTable
;
853 // Reallocate memory for check handler table.
855 HandlerTable
= ReallocateRuntimePool (
856 mMaxNumberOfHandler
* sizeof (VAR_CHECK_SET_VARIABLE_CHECK_HANDLER
),
857 (mMaxNumberOfHandler
+ VAR_CHECK_HANDLER_TABLE_SIZE
) * sizeof (VAR_CHECK_SET_VARIABLE_CHECK_HANDLER
),
862 // No enough resource to allocate.
864 if (HandlerTable
== NULL
) {
865 return RETURN_OUT_OF_RESOURCES
;
868 mHandlerTable
= HandlerTable
;
870 // Increase max handler number.
872 mMaxNumberOfHandler
= mMaxNumberOfHandler
+ VAR_CHECK_HANDLER_TABLE_SIZE
;
873 return RETURN_SUCCESS
;
877 Register SetVariable check handler.
879 @param[in] Handler Pointer to check handler.
881 @retval EFI_SUCCESS The SetVariable check handler was registered successfully.
882 @retval EFI_INVALID_PARAMETER Handler is NULL.
883 @retval EFI_ACCESS_DENIED EFI_END_OF_DXE_EVENT_GROUP_GUID or EFI_EVENT_GROUP_READY_TO_BOOT has
884 already been signaled.
885 @retval EFI_OUT_OF_RESOURCES There is not enough resource for the SetVariable check handler register request.
886 @retval EFI_UNSUPPORTED This interface is not implemented.
887 For example, it is unsupported in VarCheck protocol if both VarCheck and SmmVarCheck protocols are present.
892 VarCheckRegisterSetVariableCheckHandler (
893 IN VAR_CHECK_SET_VARIABLE_CHECK_HANDLER Handler
898 if (Handler
== NULL
) {
899 return EFI_INVALID_PARAMETER
;
903 return EFI_ACCESS_DENIED
;
906 DEBUG ((EFI_D_INFO
, "RegisterSetVariableCheckHandler - 0x%x\n", Handler
));
909 // Check whether the handler list is enough to store new handler.
911 if (mNumberOfHandler
== mMaxNumberOfHandler
) {
913 // Allocate more resources for new handler.
915 Status
= ReallocateHandlerTable();
916 if (EFI_ERROR (Status
)) {
922 // Register new handler into the handler list.
924 mHandlerTable
[mNumberOfHandler
] = Handler
;
931 Variable property get function.
933 @param[in] Name Pointer to the variable name.
934 @param[in] Guid Pointer to the vendor GUID.
935 @param[in] WildcardMatch Try wildcard match or not.
937 @return Pointer to the property of variable specified by the Name and Guid.
940 VAR_CHECK_VARIABLE_PROPERTY
*
941 VariablePropertyGetFunction (
944 IN BOOLEAN WildcardMatch
948 VAR_CHECK_VARIABLE_ENTRY
*Entry
;
949 CHAR16
*VariableName
;
950 VAR_CHECK_VARIABLE_PROPERTY
*Property
;
952 for ( Link
= GetFirstNode (&mVarCheckVariableList
)
953 ; !IsNull (&mVarCheckVariableList
, Link
)
954 ; Link
= GetNextNode (&mVarCheckVariableList
, Link
)
956 Entry
= BASE_CR (Link
, VAR_CHECK_VARIABLE_ENTRY
, Link
);
957 VariableName
= (CHAR16
*) ((UINTN
) Entry
+ sizeof (*Entry
));
958 if (CompareGuid (&Entry
->Guid
, Guid
) && (StrCmp (VariableName
, Name
) == 0)) {
959 return &Entry
->VariableProperty
;
963 Property
= GetVariableDriverVariableProperty (Name
, Guid
);
964 if (Property
== NULL
) {
965 GetUefiDefinedVariableProperty (Name
, Guid
, WildcardMatch
, &Property
, NULL
);
972 Variable property set.
974 @param[in] Name Pointer to the variable name.
975 @param[in] Guid Pointer to the vendor GUID.
976 @param[in] VariableProperty Pointer to the input variable property.
978 @retval EFI_SUCCESS The property of variable specified by the Name and Guid was set successfully.
979 @retval EFI_INVALID_PARAMETER Name, Guid or VariableProperty is NULL, or Name is an empty string,
980 or the fields of VariableProperty are not valid.
981 @retval EFI_ACCESS_DENIED EFI_END_OF_DXE_EVENT_GROUP_GUID or EFI_EVENT_GROUP_READY_TO_BOOT has
982 already been signaled.
983 @retval EFI_OUT_OF_RESOURCES There is not enough resource for the variable property set request.
988 VarCheckVariablePropertySet (
991 IN VAR_CHECK_VARIABLE_PROPERTY
*VariableProperty
995 VAR_CHECK_VARIABLE_ENTRY
*Entry
;
996 CHAR16
*VariableName
;
997 VAR_CHECK_VARIABLE_PROPERTY
*Property
;
999 if (Name
== NULL
|| Name
[0] == 0 || Guid
== NULL
) {
1000 return EFI_INVALID_PARAMETER
;
1003 if (VariableProperty
== NULL
) {
1004 return EFI_INVALID_PARAMETER
;
1007 if (VariableProperty
->Revision
!= VAR_CHECK_VARIABLE_PROPERTY_REVISION
) {
1008 return EFI_INVALID_PARAMETER
;
1012 return EFI_ACCESS_DENIED
;
1015 Status
= EFI_SUCCESS
;
1017 AcquireLockOnlyAtBootTime (&mVariableModuleGlobal
->VariableGlobal
.VariableServicesLock
);
1019 Property
= VariablePropertyGetFunction (Name
, Guid
, FALSE
);
1020 if (Property
!= NULL
) {
1021 CopyMem (Property
, VariableProperty
, sizeof (*VariableProperty
));
1023 Entry
= AllocateRuntimeZeroPool (sizeof (*Entry
) + StrSize (Name
));
1024 if (Entry
== NULL
) {
1025 Status
= EFI_OUT_OF_RESOURCES
;
1028 VariableName
= (CHAR16
*) ((UINTN
) Entry
+ sizeof (*Entry
));
1029 StrnCpy (VariableName
, Name
, StrLen (Name
));
1030 CopyGuid (&Entry
->Guid
, Guid
);
1031 CopyMem (&Entry
->VariableProperty
, VariableProperty
, sizeof (*VariableProperty
));
1032 InsertTailList (&mVarCheckVariableList
, &Entry
->Link
);
1036 ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal
->VariableGlobal
.VariableServicesLock
);
1042 Internal variable property get.
1044 @param[in] Name Pointer to the variable name.
1045 @param[in] Guid Pointer to the vendor GUID.
1046 @param[out] VariableProperty Pointer to the output variable property.
1048 @retval EFI_SUCCESS The property of variable specified by the Name and Guid was got successfully.
1049 @retval EFI_NOT_FOUND The property of variable specified by the Name and Guid was not found.
1054 InternalVarCheckVariablePropertyGet (
1057 OUT VAR_CHECK_VARIABLE_PROPERTY
*VariableProperty
1061 VARIABLE_ENTRY
*Entry
;
1062 CHAR16
*VariableName
;
1064 VAR_CHECK_VARIABLE_PROPERTY
*Property
;
1068 Property
= VariablePropertyGetFunction (Name
, Guid
, TRUE
);
1069 if (Property
!= NULL
) {
1070 CopyMem (VariableProperty
, Property
, sizeof (*VariableProperty
));
1074 for ( Link
= GetFirstNode (&mLockedVariableList
)
1075 ; !IsNull (&mLockedVariableList
, Link
)
1076 ; Link
= GetNextNode (&mLockedVariableList
, Link
)
1078 Entry
= BASE_CR (Link
, VARIABLE_ENTRY
, Link
);
1079 VariableName
= (CHAR16
*) ((UINTN
) Entry
+ sizeof (*Entry
));
1080 if (CompareGuid (&Entry
->Guid
, Guid
) && (StrCmp (VariableName
, Name
) == 0)) {
1081 VariableProperty
->Property
|= VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY
;
1083 VariableProperty
->Revision
= VAR_CHECK_VARIABLE_PROPERTY_REVISION
;
1089 return (Found
? EFI_SUCCESS
: EFI_NOT_FOUND
);
1093 Variable property get.
1095 @param[in] Name Pointer to the variable name.
1096 @param[in] Guid Pointer to the vendor GUID.
1097 @param[out] VariableProperty Pointer to the output variable property.
1099 @retval EFI_SUCCESS The property of variable specified by the Name and Guid was got successfully.
1100 @retval EFI_INVALID_PARAMETER Name, Guid or VariableProperty is NULL, or Name is an empty string.
1101 @retval EFI_NOT_FOUND The property of variable specified by the Name and Guid was not found.
1106 VarCheckVariablePropertyGet (
1109 OUT VAR_CHECK_VARIABLE_PROPERTY
*VariableProperty
1114 if (Name
== NULL
|| Name
[0] == 0 || Guid
== NULL
) {
1115 return EFI_INVALID_PARAMETER
;
1118 if (VariableProperty
== NULL
) {
1119 return EFI_INVALID_PARAMETER
;
1122 AcquireLockOnlyAtBootTime (&mVariableModuleGlobal
->VariableGlobal
.VariableServicesLock
);
1124 Status
= InternalVarCheckVariablePropertyGet (Name
, Guid
, VariableProperty
);
1126 ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal
->VariableGlobal
.VariableServicesLock
);