From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id CFE767803D1 for ; Tue, 24 Oct 2023 05:17:07 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=lCT0cYxXBep1IGmVCXlqoPYvO6rlaF+woij2N3+JpYw=; c=relaxed/simple; d=groups.io; h=From:To:Cc:References:In-Reply-To:Subject:Date:Message-ID:MIME-Version:Thread-Index:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type:Content-Transfer-Encoding:Content-Language; s=20140610; t=1698124626; v=1; b=symo1xl4/7XHbuwz0qscmGzpkuadjItjhqhq/j75t3DbFsRVS6DcN9K2h3QNIUvyXLwI8VJp 6n8mqtO4ArEChY4OpNOdEESXo2HwGw01j28htfKNt5RN9r3LJGFZv+3GArcEZD7I6AR7hQ8sg5H iW/dxT7R9owCGe3NMRxoW+Pc= X-Received: by 127.0.0.2 with SMTP id 0LVeYY7687511x927N6nTkrq; Mon, 23 Oct 2023 22:17:06 -0700 X-Received: from cxsh.intel-email.com (cxsh.intel-email.com [121.46.250.151]) by mx.groups.io with SMTP id smtpd.web10.141402.1698124623457923050 for ; Mon, 23 Oct 2023 22:17:05 -0700 X-Received: from cxsh.intel-email.com (localhost [127.0.0.1]) by cxsh.intel-email.com (Postfix) with ESMTP id AEC15DDA7FE for ; Tue, 24 Oct 2023 13:17:00 +0800 (CST) X-Received: from localhost (localhost [127.0.0.1]) by cxsh.intel-email.com (Postfix) with ESMTP id A9731DDA789 for ; Tue, 24 Oct 2023 13:17:00 +0800 (CST) X-Received: from mail.byosoft.com.cn (mail.byosoft.com.cn [58.240.74.242]) by cxsh.intel-email.com (Postfix) with SMTP id C8B3CDDA7FF for ; Tue, 24 Oct 2023 13:16:57 +0800 (CST) X-Received: from DESKTOPS6D0PVI ([58.246.60.130]) (envelope-sender ) by 192.168.6.13 with ESMTP(SSL) for ; Tue, 24 Oct 2023 13:16:55 +0800 X-WM-Sender: gaoliming@byosoft.com.cn X-Originating-IP: 58.246.60.130 X-WM-AuthFlag: YES X-WM-AuthUser: gaoliming@byosoft.com.cn From: "gaoliming via groups.io" To: , Cc: "'Zhichao Gao'" , "'Michael D Kinney'" References: <20230919143300.398-1-mikuback@linux.microsoft.com> <20230919143300.398-3-mikuback@linux.microsoft.com> In-Reply-To: <20230919143300.398-3-mikuback@linux.microsoft.com> Subject: =?UTF-8?B?5Zue5aSNOiBbZWRrMi1kZXZlbF0gW1BBVENIIHYxIDIvM10gU2hlbGxQa2c6IEFkZCB2YXJwb2xpY3kgZHluYW1pYyBzaGVsbCBjb21tYW5k?= Date: Tue, 24 Oct 2023 13:16:56 +0800 Message-ID: <01e101da0639$4f106cf0$ed3146d0$@byosoft.com.cn> MIME-Version: 1.0 Thread-Index: AQIlxg2U528gZV/l7QtCXlgQCC/zQAH2Jjilr7E0o8A= Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,gaoliming@byosoft.com.cn List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: kPn3E2mX9nm4k4jEdzhknpk6x7686176AA= Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: quoted-printable Content-Language: zh-cn X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=symo1xl4; dmarc=none; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io Michael: Will you provide standalone application for varpolicy like tftp? Thanks Liming > -----=D3=CA=BC=FE=D4=AD=BC=FE----- > =B7=A2=BC=FE=C8=CB: devel@edk2.groups.io =B4=FA=B1= =ED Michael > Kubacki > =B7=A2=CB=CD=CA=B1=BC=E4: 2023=C4=EA9=D4=C219=C8=D5 22:33 > =CA=D5=BC=FE=C8=CB: devel@edk2.groups.io > =B3=AD=CB=CD: Zhichao Gao ; Michael D Kinney > > =D6=F7=CC=E2: [edk2-devel] [PATCH v1 2/3] ShellPkg: Add varpolicy dynamic= shell > command >=20 > From: Michael Kubacki >=20 > Adds a new module (dynamic shell command) to ShellPkg that lists > variable policy information for all UEFI variables on the system. >=20 > Some other UEFI variable related functionality is also included to > give a greater sense of platform UEFI variable state. This command > is intended to help make variable policies more transparent and > easier to understand and configure on a platform. >=20 > Like all dynamic shell commands, a platform only needs to include > `VariablePolicyDynamicCommand.inf` in their flash image to have > the command registered in their UEFI shell. >=20 > Include the following lines in platform DSC (in DXE components section): >=20 > ``` >=20 > ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy > DynamicCommand.inf { > > gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE > } > ``` >=20 > Include the following line in platform FDF: >=20 > ``` > INF > ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy > DynamicCommand.inf > ``` >=20 > Cc: Zhichao Gao > Cc: Michael D Kinney > Signed-off-by: Michael Kubacki > --- >=20 > ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy > DynamicCommand.c | 1009 ++++++++++++++++++++ >=20 > ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy > DynamicCommand.h | 94 ++ >=20 > ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy > DynamicCommand.inf | 56 ++ >=20 > ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy > DynamicCommand.uni | 86 ++ > ShellPkg/ShellPkg.dsc > | 1 + > 5 files changed, 1246 insertions(+) >=20 > diff --git > a/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.c > b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.c > new file mode 100644 > index 000000000000..49993f635396 > --- /dev/null > +++ > b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.c > @@ -0,0 +1,1009 @@ > +/** @file > + Main file for the "varpolicy" dynamic UEFI shell command. > + > + This command can provide detailed UEFI variable policy configuration > + information in the UEFI shell. > + > + Copyright (c) Microsoft Corporation. > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "VariablePolicyDynamicCommand.h" > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +#define VAR_POLICY_FLAG_STATS_STR L"-s" > +#define VAR_POLICY_FLAG_POLICY_STR L"-p" > +#define VAR_POLICY_FLAG_VERBOSE_STR L"-v" > + > +#define VAR_POLICY_CMD_MIN_ATTR_STR_LEN 64 > + > +EFI_HII_HANDLE mVarPolicyShellCommandHiiHandle =3D NULL; > + > +STATIC CONST SHELL_PARAM_ITEM ParamList[] =3D { > + { VAR_POLICY_FLAG_POLICY_STR, TypeFlag }, > + { VAR_POLICY_FLAG_STATS_STR, TypeFlag }, > + { VAR_POLICY_FLAG_VERBOSE_STR, TypeFlag }, > + { NULL, TypeMax } > +}; > + > +STATIC CONST VAR_POLICY_CMD_VAR_NAMESPACE mVarNamespaces[] > =3D { > + { > + VariableVendorCapsule, > + &gEfiCapsuleVendorGuid, > + L"Capsule" > + }, > + { > + VariableVendorCapsuleReport, > + &gEfiCapsuleReportGuid, > + L"Capsule Reporting" > + }, > + { > + VariableVendorGlobal, > + &gEfiGlobalVariableGuid, > + L"UEFI Global" > + }, > + { > + VariableVendorMorControl, > + &gEfiMemoryOverwriteRequestControlLockGuid, > + L"Memory Overwrite Request (MOR) Control Lock" > + } > +}; > + > +/** > + Returns UEFI variable attribute information in a string. > + > + AttributesStrSize must at least be > VAR_POLICY_CMD_MIN_ATTR_STR_LEN in length > + or EFI_INVALID_PARAMETER will be returned. > + > + @param[in] Attributes The UEFI variable attributes. > + @param[in] AttributesStrSize The size, in bytes, of AttributesStr. > + @param[out] AttributesStr The Unicode string for the given > attributes. > + > + @retval EFI_SUCCESS The attributes were converted to a > string successfully. > + @retval EFI_INVALID_PARAMETER The AttributesStr pointer is NULL. > + > +**/ > +EFI_STATUS > +GetAttributesString ( > + IN UINT32 Attributes, > + IN UINTN AttributesStrSize, > + OUT CHAR16 *AttributesStr > + ) > +{ > + if ((AttributesStr =3D=3D NULL) || (AttributesStrSize < > VAR_POLICY_CMD_MIN_ATTR_STR_LEN)) { > + return EFI_INVALID_PARAMETER; > + } > + > + AttributesStr[0] =3D L'0'; > + AttributesStr[1] =3D L'x'; > + AttributesStr[2] =3D L'\0'; > + > + UnicodeValueToStringS (AttributesStr + 2, AttributesStrSize - 2, > (RADIX_HEX), (INT64)Attributes, 30); > + > + if (Attributes =3D=3D 0) { > + StrCatS (AttributesStr, AttributesStrSize, L" No Attributes"); > + } else { > + if ((Attributes & EFI_VARIABLE_NON_VOLATILE) =3D=3D > EFI_VARIABLE_NON_VOLATILE) { > + StrCatS (AttributesStr, AttributesStrSize, L" NV"); > + Attributes ^=3D EFI_VARIABLE_NON_VOLATILE; > + } > + > + if ((Attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS) =3D=3D > EFI_VARIABLE_BOOTSERVICE_ACCESS) { > + StrCatS (AttributesStr, AttributesStrSize, L" BS"); > + Attributes ^=3D EFI_VARIABLE_BOOTSERVICE_ACCESS; > + } > + > + if ((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) =3D=3D > EFI_VARIABLE_RUNTIME_ACCESS) { > + StrCatS (AttributesStr, AttributesStrSize, L" RT"); > + Attributes ^=3D EFI_VARIABLE_RUNTIME_ACCESS; > + } > + > + if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) =3D=3D > EFI_VARIABLE_HARDWARE_ERROR_RECORD) { > + StrCatS (AttributesStr, AttributesStrSize, L" HW-Error"); > + Attributes ^=3D EFI_VARIABLE_HARDWARE_ERROR_RECORD; > + } > + > + if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) =3D=3D > EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) { > + StrCatS (AttributesStr, AttributesStrSize, L" Auth-WA"); > + Attributes ^=3D EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS; > + } > + > + if ((Attributes & > EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) =3D=3D > EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) { > + StrCatS (AttributesStr, AttributesStrSize, L" Auth-TIME-WA"); > + Attributes ^=3D > EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS; > + } > + > + if ((Attributes & EFI_VARIABLE_APPEND_WRITE) =3D=3D > EFI_VARIABLE_APPEND_WRITE) { > + StrCatS (AttributesStr, AttributesStrSize, L" APPEND-W"); > + Attributes ^=3D EFI_VARIABLE_APPEND_WRITE; > + } > + > + if (Attributes !=3D 0) { > + StrCatS (AttributesStr, AttributesStrSize, L" "); > + } > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Prints UEFI variable statistics information. > + > + @param[in] TotalVariables Total number of UEFI variables > discovered. > + @param[in] TotalVariablesSize Total size of UEFI variables > discovered. > + > +**/ > +VOID > +PrintStats ( > + IN UINTN TotalVariables, > + IN UINTN TotalVariablesSize > + ) > +{ > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_STATS_HEADER_1), mVarPolicyShellCommandHiiHandle); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_STATS_HEADER_2), mVarPolicyShellCommandHiiHandle); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_STATS_HEADER_1), mVarPolicyShellCommandHiiHandle); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_STATS_TOTAL_VARS), mVarPolicyShellCommandHiiHandle, > TotalVariables); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_STATS_TOTAL_SIZE), mVarPolicyShellCommandHiiHandle, > TotalVariablesSize, TotalVariablesSize); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_STATS_HEADER_1), mVarPolicyShellCommandHiiHandle); > +} > + > +/** > + Returns information for the given variable namespace if available. > + > + @param[in] VariableGuid The UEFI variable vendor (namespace) > GUID. > + > + @return Pointer to a namespace info structure on a GUID match. > + @return NULL on lack of a GUID match. > + > +**/ > +CONST VAR_POLICY_CMD_VAR_NAMESPACE * > +GetNameSpaceInfo ( > + IN EFI_GUID *VariableGuid > + ) > +{ > + UINTN Index; > + > + if (VariableGuid =3D=3D NULL) { > + ASSERT (VariableGuid !=3D NULL); > + return NULL; > + } > + > + for (Index =3D 0; Index < ARRAY_SIZE (mVarNamespaces); Index++) { > + if (CompareGuid (mVarNamespaces[Index].VendorGuid, VariableGuid)) { > + return &mVarNamespaces[Index]; > + } > + } > + > + return NULL; > +} > + > +/** > + Print non-verbose information about the variable. > + > + @param[in] VariableName A pointer the Unicode > variable name. > + @param[in] VariableGuid A pointer to the variable > vendor GUID. > + @param[in] VariableSize The size of the UEFI variable in > bytes. > + @param[in] VariableAttributes The UEFI variable attributes. > + > + @retval EFI_SUCCESS The non-verbose variable > information was printed successfully. > + @retval EFI_INVALID_PARAMETER A pointer argument passed to > the function was NULL. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory > resources to print the attributes. > + > +**/ > +EFI_STATUS > +PrintNonVerboseVarInfo ( > + IN CHAR16 *VariableName, > + IN EFI_GUID *VariableGuid, > + IN UINTN VariableSize, > + IN UINT32 VariableAttributes > + ) > +{ > + EFI_STATUS Status; > + CHAR16 *AttributesStr; > + CHAR16 *DescriptionStr; > + CONST VAR_POLICY_CMD_VAR_NAMESPACE *CmdVarNamespace; > + > + AttributesStr =3D NULL; > + DescriptionStr =3D NULL; > + > + if ((VariableName =3D=3D NULL) || (VariableGuid =3D=3D NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + CmdVarNamespace =3D GetNameSpaceInfo (VariableGuid); > + > + if (CmdVarNamespace =3D=3D NULL) { > + DescriptionStr =3D AllocatePages (1); > + if (DescriptionStr =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + goto Exit; > + } > + > + ZeroMem ((VOID *)DescriptionStr, EFI_PAGES_TO_SIZE (1)); > + UnicodeSPrint (DescriptionStr, EFI_PAGES_TO_SIZE (1), L"Unknown > Vendor (%g)", VariableGuid); > + } else { > + DescriptionStr =3D CmdVarNamespace->Description; > + } > + > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_VAR_TYPE), > mVarPolicyShellCommandHiiHandle, DescriptionStr); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_VAR_NAME), > mVarPolicyShellCommandHiiHandle, VariableName); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_VAR_SIZE), > mVarPolicyShellCommandHiiHandle, VariableSize, VariableSize); > + > + AttributesStr =3D AllocatePages (1); > + if (AttributesStr =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + goto Exit; > + } > + > + ZeroMem ((VOID *)AttributesStr, EFI_PAGES_TO_SIZE (1)); > + Status =3D GetAttributesString (VariableAttributes, EFI_PAGES_TO_SIZE (1), > AttributesStr); > + if (Status =3D=3D EFI_SUCCESS) { > + ShellPrintHiiEx ( > + -1, > + -1, > + NULL, > + STRING_TOKEN (STR_VAR_POL_VAR_ATTR), > + mVarPolicyShellCommandHiiHandle, > + AttributesStr > + ); > + } > + > + Status =3D EFI_SUCCESS; > + > +Exit: > + if (AttributesStr !=3D NULL) { > + FreePages (AttributesStr, 1); > + } > + > + if ((CmdVarNamespace =3D=3D NULL) && (DescriptionStr !=3D NULL)) { > + FreePages (DescriptionStr, 1); > + } > + > + return Status; > +} > + > +/** > + Print verbose information about the variable. > + > + @param[in] Data A pointer to the variable data > buffer. > + @param[in] DataSize The size of data, in bytes, in > the variable data buffer. > + > + @retval EFI_SUCCESS The verbose variable > information was printed successfully. > + @retval EFI_INVALID_PARAMETER A pointer argument passed to > the function was NULL. > + > +**/ > +EFI_STATUS > +PrintVerboseVarInfo ( > + IN VOID *Data, > + IN UINTN DataSize > + ) > +{ > + if ((DataSize =3D=3D 0) || (Data =3D=3D NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + VAR_POLICY_CMD_SHELL_DUMP_HEX (0, Data, DataSize); > + > + return EFI_SUCCESS; > +} > + > +/** > + Prints variable policy information for the given variable. > + > + @param[in] VariableName A pointer to the Unicode string of the > UEFI variable name. > + @param[in] VendorGuid A pointer to the UEFI variable vendor > GUID. > + > + @return TRUE if a variable policy was found and printed for the variable. > + @return FALSE if an error occurred and/or a variable policy was not found > and > + printed for the variable. > + > +**/ > +BOOLEAN > +PrintVariablePolicyInfo ( > + IN CHAR16 *VariableName, > + IN EFI_GUID *VendorGuid > + ) > +{ > + EFI_STATUS Status; > + VARIABLE_POLICY_ENTRY VariablePolicyEntry; > + VARIABLE_LOCK_ON_VAR_STATE_POLICY LockOnVarStatePolicy; > + UINTN > VariablePolicyVariableNameBufferSize; > + UINTN ReturnedVariableNameSize; > + BOOLEAN PolicyHeaderPresent; > + CHAR16 > *VariablePolicyVariableName; > + CHAR16 *VariableAttributesStr; > + EDKII_VARIABLE_POLICY_PROTOCOL *VariablePolicy; > + > + PolicyHeaderPresent =3D FALSE; > + VariableAttributesStr =3D NULL; > + VariablePolicyVariableName =3D NULL; > + > + if ((VariableName =3D=3D NULL) || (VendorGuid =3D=3D NULL)) { > + ASSERT ((VariableName !=3D NULL) && (VendorGuid !=3D NULL)); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_INT_ERR), mVarPolicyShellCommandHiiHandle); > + return FALSE; > + } > + > + Status =3D gBS->LocateProtocol (&gEdkiiVariablePolicyProtocolGuid, NUL= L, > (VOID **)&VariablePolicy); > + if (EFI_ERROR (Status)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_NO_PROT), mVarPolicyShellCommandHiiHandle); > + return FALSE; > + } > + > + VariablePolicyVariableNameBufferSize =3D EFI_PAGES_TO_SIZE (1); > + VariablePolicyVariableName =3D AllocatePages > (EFI_SIZE_TO_PAGES (VariablePolicyVariableNameBufferSize)); > + if (VariablePolicyVariableName =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + ASSERT_EFI_ERROR (Status); > + goto Done; > + } > + > + ZeroMem (VariablePolicyVariableName, > VariablePolicyVariableNameBufferSize); > + ReturnedVariableNameSize =3D VariablePolicyVariableNameBufferSize; > + Status =3D VariablePolicy->GetVariablePolicyInfo ( > + VariableName, > + VendorGuid, > + > &ReturnedVariableNameSize, > + > &VariablePolicyEntry, > + > VariablePolicyVariableName > + ); > + if (Status =3D=3D EFI_NOT_READY) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_NOT_INIT), mVarPolicyShellCommandHiiHandle); > + } else if (Status =3D=3D EFI_NOT_FOUND) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_NOT_FOUND), mVarPolicyShellCommandHiiHandle); > + } else if (EFI_ERROR (Status)) { > + // A different error return code is not expected > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_UNEXP_ERR), mVarPolicyShellCommandHiiHandle, > Status); > + } else { > + PolicyHeaderPresent =3D TRUE; > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_HEADER_1), mVarPolicyShellCommandHiiHandle); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_HEADER_2), mVarPolicyShellCommandHiiHandle); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_HEADER_1), mVarPolicyShellCommandHiiHandle); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_VERSION), mVarPolicyShellCommandHiiHandle, > VariablePolicyEntry.Version); > + > + if ((ReturnedVariableNameSize > 0) && > (VariablePolicyVariableName[0] !=3D CHAR_NULL)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_VARIABLE), mVarPolicyShellCommandHiiHandle, > VariablePolicyVariableName); > + } else { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_VARIABLE), mVarPolicyShellCommandHiiHandle, > L""); > + } > + > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_NAMESPACE), mVarPolicyShellCommandHiiHandle, > &VariablePolicyEntry.Namespace); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_MIN_SIZE), mVarPolicyShellCommandHiiHandle, > VariablePolicyEntry.MinSize); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_MAX_SIZE), mVarPolicyShellCommandHiiHandle, > VariablePolicyEntry.MaxSize); > + > + switch (VariablePolicyEntry.LockPolicyType) { > + case VARIABLE_POLICY_TYPE_NO_LOCK: > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, > L"No Lock"); > + break; > + case VARIABLE_POLICY_TYPE_LOCK_NOW: > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, > L"Lock Now"); > + break; > + case VARIABLE_POLICY_TYPE_LOCK_ON_CREATE: > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, > L"On Create"); > + break; > + case VARIABLE_POLICY_TYPE_LOCK_ON_VAR_STATE: > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, > L"On Variable State"); > + > + ZeroMem (VariablePolicyVariableName, > VariablePolicyVariableNameBufferSize); > + ReturnedVariableNameSize =3D > VariablePolicyVariableNameBufferSize; > + Status =3D > VariablePolicy->GetLockOnVariableStateVariablePolicyInfo ( > + > VariableName, > + > VendorGuid, > + > &ReturnedVariableNameSize, > + > &LockOnVarStatePolicy, > + > VariablePolicyVariableName > + ); > + if (EFI_ERROR (Status)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_UNEXP_ERR), mVarPolicyShellCommandHiiHandle, > Status); > + goto Done; > + } else { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_STATE_NS), mVarPolicyShellCommandHiiHandle, > &LockOnVarStatePolicy.Namespace); > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_STATE_VAL), mVarPolicyShellCommandHiiHandle, > LockOnVarStatePolicy.Value); > + if ((ReturnedVariableNameSize > 0) && > (VariablePolicyVariableName[0] !=3D CHAR_NULL)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_STATE_NAME), mVarPolicyShellCommandHiiHandle, > VariablePolicyVariableName); > + } else { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_STATE_NAME), mVarPolicyShellCommandHiiHandle, > L""); > + } > + } > + > + break; > + default: > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, > L"Unknown"); > + break; > + } > + > + VariableAttributesStr =3D AllocatePages (1); > + if (VariableAttributesStr =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + ASSERT_EFI_ERROR (Status); > + goto Done; > + } > + > + ZeroMem (VariableAttributesStr, EFI_PAGES_TO_SIZE (1)); > + Status =3D GetAttributesString (VariablePolicyEntry.AttributesMustHa= ve, > EFI_PAGES_TO_SIZE (1), VariableAttributesStr); > + if (Status =3D=3D EFI_SUCCESS) { > + ShellPrintHiiEx ( > + -1, > + -1, > + NULL, > + STRING_TOKEN (STR_VAR_POL_POLICY_ATTR_MUST), > + mVarPolicyShellCommandHiiHandle > + ); > + ShellPrintHiiEx ( > + -1, > + -1, > + NULL, > + STRING_TOKEN (STR_VAR_POL_POLICY_ATTR_GEN), > + mVarPolicyShellCommandHiiHandle, > + VariableAttributesStr > + ); > + } > + > + ZeroMem (VariableAttributesStr, EFI_PAGES_TO_SIZE (1)); > + Status =3D GetAttributesString (VariablePolicyEntry.AttributesCantHa= ve, > EFI_PAGES_TO_SIZE (1), VariableAttributesStr); > + if (Status =3D=3D EFI_SUCCESS) { > + ShellPrintHiiEx ( > + -1, > + -1, > + NULL, > + STRING_TOKEN (STR_VAR_POL_POLICY_ATTR_NOT), > + mVarPolicyShellCommandHiiHandle > + ); > + ShellPrintHiiEx ( > + -1, > + -1, > + NULL, > + STRING_TOKEN (STR_VAR_POL_POLICY_ATTR_GEN), > + mVarPolicyShellCommandHiiHandle, > + VariableAttributesStr > + ); > + } > + } > + > +Done: > + if (PolicyHeaderPresent) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_VAR_POL_POLICY_HEADER_1), mVarPolicyShellCommandHiiHandle); > + } > + > + if (VariableAttributesStr !=3D NULL) { > + FreePages (VariableAttributesStr, 1); > + } > + > + if (VariablePolicyVariableName !=3D NULL) { > + FreePages (VariablePolicyVariableName, 1); > + } > + > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_LINE_BREAK), > mVarPolicyShellCommandHiiHandle); > + > + return Status =3D=3D EFI_SUCCESS; > +} > + > +/** > + Gets the next UEFI variable name. > + > + This buffer manages the UEFI variable name buffer, performing memory > reallocations as necessary. > + > + Note: The first time this function is called, VariableNameBufferSize must > be 0 and > + the VariableName buffer pointer must point to NULL. > + > + @param[in,out] VariableNameBufferSize On input, a pointer to a > buffer that holds the current > + size of the > VariableName buffer in bytes. > + On output, a pointer to > a buffer that holds the updated > + size of the > VariableName buffer in bytes. > + @param[in,out] VariableName On input, a pointer to a > pointer to a buffer that holds the > + current UEFI variable > name. > + On output, a pointer to > a pointer to a buffer that holds the > + next UEFI variable > name. > + @param[in,out] VariableGuid On input, a pointer to a > buffer that holds the current UEFI > + variable GUID. > + On output, a pointer to > a buffer that holds the next UEFI > + variable GUID. > + > + @retval EFI_SUCCESS The next UEFI variable name > was found successfully. > + @retval EFI_INVALID_PARAMETER A pointer argument is NULL > or initial input values are invalid. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory > resources to allocate a required buffer. > + @retval Others Return status codes from the > UEFI spec define GetNextVariableName() interface. > + > +**/ > +EFI_STATUS > +GetNextVariableNameWithDynamicReallocation ( > + IN OUT UINTN *VariableNameBufferSize, > + IN OUT CHAR16 **VariableName, > + IN OUT EFI_GUID *VariableGuid > + ) > +{ > + EFI_STATUS Status; > + UINTN NextVariableNameBufferSize; > + > + if ((VariableNameBufferSize =3D=3D NULL) || (VariableName =3D=3D NULL)= || > (VariableGuid =3D=3D NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (*VariableNameBufferSize =3D=3D 0) { > + if (*VariableName !=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Allocate a buffer to temporarily hold variable names. To reduce > memory > + // allocations, the default buffer size is 256 characters. The buffe= r can > + // be reallocated if expansion is necessary (should be very rare). > + // > + *VariableNameBufferSize =3D sizeof (CHAR16) * 256; > + *VariableName =3D AllocateZeroPool > (*VariableNameBufferSize); > + if (*VariableName =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + ZeroMem ((VOID *)VariableGuid, sizeof (EFI_GUID)); > + } > + > + NextVariableNameBufferSize =3D *VariableNameBufferSize; > + Status =3D gRT->GetNextVariableName ( > + > &NextVariableNameBufferSize, > + *VariableName, > + VariableGuid > + ); > + if (Status =3D=3D EFI_BUFFER_TOO_SMALL) { > + *VariableName =3D ReallocatePool ( > + *VariableNameBufferSize, > + NextVariableNameBufferSize, > + *VariableName > + ); > + if (*VariableName =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + *VariableNameBufferSize =3D NextVariableNameBufferSize; > + > + Status =3D gRT->GetNextVariableName ( > + &NextVariableNameBufferSize, > + *VariableName, > + VariableGuid > + ); > + ASSERT (Status !=3D EFI_BUFFER_TOO_SMALL); > + } > + > + return Status; > +} > + > +/** > + Dumps UEFI variable information. > + > + This is the main function that enumerates UEFI variables and prints th= e > information > + selected by the user. > + > + @param[in] Verbose Whether to print verbose information. > + @param[in] Stats Whether to print statistical > information. > + @param[in] PolicyCheck Whether to print variable policy related > information. > + > + > + @retval EFI_SUCCESS The UEFI variable information > was dumped successfully. > + @retval EFI_DEVICE_ERROR An error occurred attempting > to get UEFI variable information. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory > resources to allocate a required buffer. > + > +**/ > +EFI_STATUS > +DumpVars ( > + IN BOOLEAN Verbose, > + IN BOOLEAN Stats, > + IN BOOLEAN PolicyCheck > + ) > +{ > + EFI_STATUS Status; > + EFI_STATUS GetNextVariableStatus; > + UINT32 Attributes; > + UINTN CurrentVariableDataBufferSize; > + UINTN DataSize; > + UINTN TotalDataSize; > + UINTN TotalVariables; > + UINTN TotalVariablesWithPolicy; > + UINTN VariableNameBufferSize; > + EFI_GUID VariableGuid; > + CHAR16 *VariableName; > + VOID *Data; > + > + Status =3D EFI_SUCCESS; > + Data =3D NULL; > + VariableName =3D NULL; > + CurrentVariableDataBufferSize =3D 0; > + TotalDataSize =3D 0; > + TotalVariables =3D 0; > + TotalVariablesWithPolicy =3D 0; > + VariableNameBufferSize =3D 0; > + > + do { > + GetNextVariableStatus =3D > GetNextVariableNameWithDynamicReallocation ( > + &VariableNameBufferSize, > + &VariableName, > + &VariableGuid > + ); > + > + if (!EFI_ERROR (GetNextVariableStatus)) { > + DataSize =3D 0; > + Status =3D gRT->GetVariable ( > + VariableName, > + &VariableGuid, > + &Attributes, > + &DataSize, > + NULL > + ); > + if (Status !=3D EFI_BUFFER_TOO_SMALL) { > + // If the variable exists, a zero size buffer should be too smal= l > + Status =3D EFI_DEVICE_ERROR; > + goto DeallocateAndExit; > + } > + > + TotalDataSize +=3D DataSize; > + TotalVariables++; > + > + if (!Stats || Verbose) { > + Status =3D PrintNonVerboseVarInfo (VariableName, &VariableGuid, > DataSize, Attributes); > + if (!EFI_ERROR (Status)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); > + } > + } > + > + if (PolicyCheck || Verbose) { > + if (PrintVariablePolicyInfo (VariableName, &VariableGuid)) { > + TotalVariablesWithPolicy++; > + } > + } > + > + if (Verbose) { > + if (CurrentVariableDataBufferSize < DataSize) { > + if (Data !=3D NULL) { > + FreePool (Data); > + } > + > + Data =3D AllocateZeroPool (DataSize); > + if (Data =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + goto DeallocateAndExit; > + } > + > + CurrentVariableDataBufferSize =3D DataSize; > + } > + > + Status =3D gRT->GetVariable ( > + VariableName, > + &VariableGuid, > + NULL, > + &DataSize, > + Data > + ); > + if (EFI_ERROR (Status)) { > + Status =3D EFI_DEVICE_ERROR; > + goto DeallocateAndExit; > + } > + > + Status =3D PrintVerboseVarInfo (Data, DataSize); > + if (EFI_ERROR (Status)) { > + Status =3D EFI_DEVICE_ERROR; > + goto DeallocateAndExit; > + } > + } > + } > + } while (!EFI_ERROR (GetNextVariableStatus)); > + > + if (TotalVariables =3D=3D 0) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VARS), > mVarPolicyShellCommandHiiHandle); > + } else { > + if (Verbose || Stats) { > + PrintStats (TotalVariables, TotalDataSize); > + } > + > + if (Verbose || PolicyCheck) { > + ASSERT (TotalVariablesWithPolicy <=3D TotalVariables); > + > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); > + if (TotalVariablesWithPolicy =3D=3D TotalVariables) { > + ShellPrintHiiEx ( > + -1, > + -1, > + NULL, > + STRING_TOKEN (STR_VAR_POL_POLICY_STATS_PASS), > + mVarPolicyShellCommandHiiHandle, > + TotalVariablesWithPolicy, > + TotalVariables > + ); > + } else { > + ShellPrintHiiEx ( > + -1, > + -1, > + NULL, > + STRING_TOKEN (STR_VAR_POL_POLICY_STATS_FAIL), > + mVarPolicyShellCommandHiiHandle, > + TotalVariablesWithPolicy, > + TotalVariables > + ); > + } > + > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); > + } > + } > + > + Status =3D EFI_SUCCESS; > + > +DeallocateAndExit: > + if (VariableName !=3D NULL) { > + FreePool (VariableName); > + } > + > + if (Data !=3D NULL) { > + FreePool (Data); > + } > + > + ASSERT_EFI_ERROR (Status); > + > + return Status; > +} > + > +/** > + Main entry function for the "varpolicy" command. > + > + @param[in] ImageHandle Handle to the Image (NULL if Internal). > + @param[in] SystemTable Pointer to the System Table (NULL if Internal)= . > + > + @retval SHELL_SUCCESS The "varpolicy" shell > command executed successfully. > + @retval SHELL_INVALID_PARAMETER An argument passed to > the shell command is invalid. > + @retval Others A different error occurred. > + > +**/ > +SHELL_STATUS > +EFIAPI > +ShellCommandRunVarPolicy ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + SHELL_STATUS ShellStatus; > + BOOLEAN PolicyCheck; > + BOOLEAN StatsDump; > + BOOLEAN VerboseDump; > + LIST_ENTRY *Package; > + CHAR16 *ProblemParam; > + > + Package =3D NULL; > + ShellStatus =3D SHELL_INVALID_PARAMETER; > + Status =3D EFI_SUCCESS; > + PolicyCheck =3D FALSE; > + StatsDump =3D FALSE; > + VerboseDump =3D FALSE; > + > + Status =3D ShellInitialize (); > + ASSERT_EFI_ERROR (Status); > + > + Status =3D ShellCommandLineParse (ParamList, &Package, &ProblemParam, > TRUE); > + if (EFI_ERROR (Status)) { > + if ((Status =3D=3D EFI_VOLUME_CORRUPTED) && (ProblemParam !=3D NULL)= ) > { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), > mVarPolicyShellCommandHiiHandle, VAR_POLICY_COMMAND_NAME, > ProblemParam); > + FreePool (ProblemParam); > + ShellStatus =3D SHELL_INVALID_PARAMETER; > + goto Done; > + } else { > + ASSERT (FALSE); > + } > + } else { > + if (ShellCommandLineGetCount (Package) > 1) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_GEN_TOO_MANY), mVarPolicyShellCommandHiiHandle, > VAR_POLICY_COMMAND_NAME); > + ShellStatus =3D SHELL_INVALID_PARAMETER; > + goto Done; > + } > + > + PolicyCheck =3D ShellCommandLineGetFlag (Package, > VAR_POLICY_FLAG_POLICY_STR); > + StatsDump =3D ShellCommandLineGetFlag (Package, > VAR_POLICY_FLAG_STATS_STR); > + VerboseDump =3D ShellCommandLineGetFlag (Package, > VAR_POLICY_FLAG_VERBOSE_STR); > + > + Status =3D DumpVars (VerboseDump, StatsDump, PolicyCheck); > + ASSERT_EFI_ERROR (Status); > + } > + > +Done: > + if (Package !=3D NULL) { > + ShellCommandLineFreeVarList (Package); > + } > + > + return ShellStatus; > +} > + > +/** > + This is the shell command handler function pointer callback type. > + > + This function handles the command when it is invoked in the shell. > + > + @param[in] This The instance of the > + > EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL. > + @param[in] SystemTable The pointer to the system table. > + @param[in] ShellParameters The parameters associated with > the command. > + @param[in] Shell The instance of the shell protocol > used in > + the context of processing this > command. > + > + @return EFI_SUCCESS the operation was successful > + @return other the operation failed. > + > +**/ > +SHELL_STATUS > +EFIAPI > +VarPolicyCommandHandler ( > + IN EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL *This, > + IN EFI_SYSTEM_TABLE *SystemTable, > + IN EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters, > + IN EFI_SHELL_PROTOCOL *Shell > + ) > +{ > + gEfiShellParametersProtocol =3D ShellParameters; > + gEfiShellProtocol =3D Shell; > + > + return ShellCommandRunVarPolicy (gImageHandle, SystemTable); > +} > + > +/** > + This is the command help handler function pointer callback type. This > + function is responsible for displaying help information for the associated > + command. > + > + @param[in] This The instance of the > + > EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL. > + @param[in] Language The pointer to the language > string to use. > + > + @return string Pool allocated help string, must be > freed > + by caller. > + > +**/ > +STATIC > +CHAR16 * > +EFIAPI > +VarPolicyCommandGetHelp ( > + IN EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL *This, > + IN CONST CHAR8 *Language > + ) > +{ > + return HiiGetString ( > + mVarPolicyShellCommandHiiHandle, > + STRING_TOKEN (STR_GET_HELP_VAR_POLICY), > + Language > + ); > +} > + > +STATIC EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL > mVarPolicyDynamicCommand =3D { > + VAR_POLICY_COMMAND_NAME, > + VarPolicyCommandHandler, > + VarPolicyCommandGetHelp > +}; > + > +/** > + Retrieve HII package list from ImageHandle and publish to HII database= . > + > + @param[in] ImageHandle The image handle of the process. > + > + @return HII handle. > + > +**/ > +STATIC > +EFI_HII_HANDLE > +InitializeHiiPackage ( > + IN EFI_HANDLE ImageHandle > + ) > +{ > + EFI_STATUS Status; > + EFI_HII_PACKAGE_LIST_HEADER *PackageList; > + EFI_HII_HANDLE HiiHandle; > + > + // > + // Retrieve HII package list from ImageHandle > + // > + Status =3D gBS->OpenProtocol ( > + ImageHandle, > + &gEfiHiiPackageListProtocolGuid, > + (VOID **)&PackageList, > + ImageHandle, > + NULL, > + EFI_OPEN_PROTOCOL_GET_PROTOCOL > + ); > + ASSERT_EFI_ERROR (Status); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + > + // > + // Publish HII package list to HII Database. > + // > + Status =3D gHiiDatabase->NewPackageList ( > + gHiiDatabase, > + PackageList, > + NULL, > + &HiiHandle > + ); > + ASSERT_EFI_ERROR (Status); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + > + return HiiHandle; > +} > + > +/** > + Entry point of the UEFI variable policy dynamic shell command. > + > + Produce the Dynamic Command Protocol to handle the "varpolicy" > command. > + > + @param[in] ImageHandle The image handle of the process. > + @param[in] SystemTable The EFI System Table pointer. > + > + @retval EFI_SUCCESS The "varpolicy" command executed > successfully. > + @retval EFI_ABORTED HII package failed to initialize. > + @retval others Other errors when executing > "varpolicy" command. > + > +**/ > +EFI_STATUS > +EFIAPI > +VariablePolicyDynamicCommandEntryPoint ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + mVarPolicyShellCommandHiiHandle =3D InitializeHiiPackage (ImageHandle)= ; > + if (mVarPolicyShellCommandHiiHandle =3D=3D NULL) { > + return EFI_ABORTED; > + } > + > + Status =3D gBS->InstallProtocolInterface ( > + &ImageHandle, > + &gEfiShellDynamicCommandProtocolGuid, > + EFI_NATIVE_INTERFACE, > + &mVarPolicyDynamicCommand > + ); > + ASSERT_EFI_ERROR (Status); > + > + return Status; > +} > + > +/** > + Unload the dynamic "varpolicy" UEFI Shell command. > + > + @param[in] ImageHandle The image handle of the process. > + > + @retval EFI_SUCCESS The image is unloaded. > + @retval Others Failed to unload the image. > + > +**/ > +EFI_STATUS > +EFIAPI > +VariablePolicyDynamicCommandUnload ( > + IN EFI_HANDLE ImageHandle > + ) > +{ > + EFI_STATUS Status; > + > + Status =3D gBS->UninstallProtocolInterface ( > + ImageHandle, > + &gEfiShellDynamicCommandProtocolGuid, > + &mVarPolicyDynamicCommand > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + HiiRemovePackages (mVarPolicyShellCommandHiiHandle); > + > + return EFI_SUCCESS; > +} > diff --git > a/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.h > b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.h > new file mode 100644 > index 000000000000..7ce5beca389a > --- /dev/null > +++ > b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.h > @@ -0,0 +1,94 @@ > +/** @file > + Internal header file for the module. > + > + Copyright (c) Microsoft Corporation. > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef VAR_POLICY_DYNAMIC_SHELL_COMMAND_H_ > +#define VAR_POLICY_DYNAMIC_SHELL_COMMAND_H_ > + > +#include > + > +#define VAR_POLICY_COMMAND_NAME L"varpolicy" > + > +typedef enum { > + VariableVendorCapsule, > + VariableVendorCapsuleReport, > + VariableVendorGlobal, > + VariableVendorMorControl, > + VariableVendorGuidMax > +} VAR_POLICY_CMD_VENDOR_GUID_TYPE; > + > +typedef struct { > + VAR_POLICY_CMD_VENDOR_GUID_TYPE VendorGuidType; > + EFI_GUID *VendorGuid; > + CHAR16 *Description; > +} VAR_POLICY_CMD_VAR_NAMESPACE; > + > +/** > + Log a formatted console message. > + > + This is not specific to this shell command but scoped so to prevent global > + name conflicts. > + > + The hex dump is split into lines of 16 dumped bytes. > + > + The full hex dump is bracketed, and its byte ascii char also print. > + If the byte value is not an ascii code, it will print as '.' > + > + @param[in] Offset Offset to be display after PrefixFormat. > + Offset will be increased for each print > line. > + @param[in] Data The data to dump. > + @param[in] DataSize Number of bytes in Data. > + > +**/ > +#define VAR_POLICY_CMD_SHELL_DUMP_HEX(Offset, > \ > + Data, > \ > + DataSize > \ > + ) > \ > + > { > \ > + UINT8 *_DataToDump; > \ > + UINT8 _Val[50]; > \ > + UINT8 _Str[20]; > \ > + UINT8 _TempByte; > \ > + UINTN _Size; > \ > + UINTN _DumpHexIndex; > \ > + UINTN _LocalOffset; > \ > + UINTN _LocalDataSize; > \ > + CONST CHAR8 *_Hex =3D "0123456789ABCDEF"; > \ > + _LocalOffset =3D (Offset); > \ > + _LocalDataSize =3D (DataSize); > \ > + _DataToDump =3D (UINT8 *)(Data); > \ > + > \ > + ASSERT (_DataToDump !=3D NULL); > \ > + > \ > + while (_LocalDataSize !=3D 0) > { \ > + _Size =3D 16; > \ > + if (_Size > _LocalDataSize) > { \ > + _Size =3D _LocalDataSize; > \ > + } > \ > + > \ > + for (_DumpHexIndex =3D 0; _DumpHexIndex < _Size; > _DumpHexIndex +=3D 1) { \ > + _TempByte =3D (UINT8) > _DataToDump[_DumpHexIndex]; \ > + _Val[_DumpHexIndex * 3 + 0] =3D (UINT8) > _Hex[_TempByte >> 4]; \ > + _Val[_DumpHexIndex * 3 + 1] =3D (UINT8) > _Hex[_TempByte & 0xF]; \ > + _Val[_DumpHexIndex * 3 + 2] =3D > \ > + (CHAR8) ((_DumpHexIndex =3D=3D 7) ? '-' : ' '); > \ > + _Str[_DumpHexIndex] =3D > \ > + (CHAR8) ((_TempByte < ' ' || _TempByte > '~') ? '.' : > _TempByte); \ > + } > \ > + > \ > + _Val[_DumpHexIndex * 3] =3D 0; > \ > + _Str[_DumpHexIndex] =3D 0; > \ > + > \ > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_GEN_HEX_DUMP_LINE), mVarPolicyShellCommandHiiHandle, > _LocalOffset, _Val, _Str); \ > + _DataToDump =3D (UINT8 *)(((UINTN)_DataToDump) + _Size); > \ > + _LocalOffset +=3D _Size; > \ > + _LocalDataSize -=3D _Size; > \ > + } > \ > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); \ > + } > + > +#endif > diff --git > a/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.inf > b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.inf > new file mode 100644 > index 000000000000..22b4baa5e6f2 > --- /dev/null > +++ > b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.inf > @@ -0,0 +1,56 @@ > +## @file > +# A UEFI variable policy dynamic shell command that displays information > +# about UEFI variable policy configuration on the system. > +# > +# Copyright (c) Microsoft Corporation. > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION =3D 1.27 > + BASE_NAME =3D VariablePolicyDynamicCommand > + FILE_GUID =3D > 17D0EF2A-5933-4007-8950-5749169D3DC5 > + MODULE_TYPE =3D DXE_DRIVER > + VERSION_STRING =3D 1.0 > + ENTRY_POINT =3D > VariablePolicyDynamicCommandEntryPoint > + UNLOAD_IMAGE =3D > VariablePolicyDynamicCommandUnload > + UEFI_HII_RESOURCE_SECTION =3D TRUE > + > +[Sources.common] > + VariablePolicyDynamicCommand.c > + VariablePolicyDynamicCommand.h > + VariablePolicyDynamicCommand.uni > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + ShellPkg/ShellPkg.dec > + > +[LibraryClasses] > + BaseLib > + BaseMemoryLib > + DebugLib > + HiiLib > + MemoryAllocationLib > + PrintLib > + ShellLib > + UefiBootServicesTableLib > + UefiDriverEntryPoint > + UefiHiiServicesLib > + UefiRuntimeServicesTableLib > + > +[Protocols] > + gEdkiiVariablePolicyProtocolGuid ## > SOMETIMES_CONSUMES > + gEfiHiiPackageListProtocolGuid ## CONSUMES > + gEfiShellDynamicCommandProtocolGuid ## PRODUCES > + > +[Guids] > + ## SOMETIMES_CONSUMES ## Variables in Vendor Namespace > + gEfiCapsuleReportGuid > + gEfiCapsuleVendorGuid > + gEfiGlobalVariableGuid > + gEfiMemoryOverwriteRequestControlLockGuid > + > +[DEPEX] > + TRUE > diff --git > a/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.uni > b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.uni > new file mode 100644 > index 000000000000..a65f477b41c3 > --- /dev/null > +++ > b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePoli > cyDynamicCommand.uni > @@ -0,0 +1,86 @@ > +// /** > +// String definitions for the Variable Policy ("varpolicy") shell command. > +// > +// Copyright (c) Microsoft Corporation. > +// SPDX-License-Identifier: BSD-2-Clause-Patent > +// > +// **/ > + > +/=3D# > + > +#langdef en-US "english" > + > +// General Strings > +#string STR_GEN_PROBLEM #language en-US "%H%s%N: > Unknown flag - '%H%s%N'\r\n" > +#string STR_GEN_TOO_MANY #language en-US "%H%s%N: > Too many arguments.\r\n" > +#string STR_GEN_NO_VARS #language en-US "No UEFI > variables found!\r\n" > +#string STR_GEN_LINE_BREAK #language en-US "\r\n" > + > +#string STR_GEN_HEX_DUMP_LINE #language en-US > "%B%08X%N: %-48a %V*%a*%N\r\n" > + > +#string STR_VAR_POL_POLICY_INT_ERR #language en-US "%EInternal > Application Error Getting Policy Info!%N\r\n" > +#string STR_VAR_POL_POLICY_NO_PROT #language en-US > "%EVariable Policy Protocol Was Not Found!%N\r\n" > +#string STR_VAR_POL_POLICY_NOT_INIT #language en-US "%EUEFI > Variable Policy is Not Initialized!%N\r\n" > +#string STR_VAR_POL_POLICY_NOT_FOUND #language en-US > "%EVariable Policy Not Found for This Variable!%N\r\n" > +#string STR_VAR_POL_POLICY_UNEXP_ERR #language en-US > "%EUnexpected Error Getting Policy Info!%N - %H%r%N\r\n" > +#string STR_VAR_POL_POLICY_HEADER_1 #language en-US > "+-------------------------------------------------------------------------= - ---+\r\n" > +#string STR_VAR_POL_POLICY_HEADER_2 #language en-US "| Variable > Policy Info > |\r\n" > +#string STR_VAR_POL_POLICY_VERSION #language en-US "| Version: > 0x%-8x > |\r\n" > +#string STR_VAR_POL_POLICY_VARIABLE #language en-US "| Variable: % > -64s |\r\n" > +#string STR_VAR_POL_POLICY_NAMESPACE #language en-US "| > Namespace: {%g} |\r\n" > +#string STR_VAR_POL_POLICY_MIN_SIZE #language en-US "| Minimum > Size: 0x%-8x > |\r\n" > +#string STR_VAR_POL_POLICY_MAX_SIZE #language en-US "| > Maximum Size: 0x%-8x > |\r\n" > +#string STR_VAR_POL_POLICY_ATTR_MUST #language en-US "| > Required Attributes: > |\r\n" > +#string STR_VAR_POL_POLICY_ATTR_NOT #language en-US "| > Disallowed Attributes: > |\r\n" > +#string STR_VAR_POL_POLICY_ATTR_GEN #language en-US > "| %73-.73s |\r\n" > +#string STR_VAR_POL_POLICY_LOCK_TYPE #language en-US "| Lock > Type: % -64s |\r\n" > +#string STR_VAR_POL_POLICY_STATE_NS #language en-US "| > Namespace: {%g} |\r\n" > +#string STR_VAR_POL_POLICY_STATE_VAL #language en-US "| Value: > 0x%-8x > |\r\n" > +#string STR_VAR_POL_POLICY_STATE_NAME #language en-US "| > Name: % -64s |\r\n" > +#string STR_VAR_POL_POLICY_STATS_PASS #language en-US > " %V%d/%d UEFI variables have policy%N\r\n" > +#string STR_VAR_POL_POLICY_STATS_FAIL #language en-US " %E%d/%d > UEFI variables have policy%N\r\n" > + > +#string STR_VAR_POL_VAR_TYPE #language en-US "%H% > -70s%N\r\n" > +#string STR_VAR_POL_VAR_NAME #language en-US "Name: % > -70s\r\n" > +#string STR_VAR_POL_VAR_SIZE #language en-US "Size: 0x%-16x > (%-,d) bytes\r\n" > +#string STR_VAR_POL_VAR_ATTR #language en-US "Attributes: % > -60s\r\n" > + > +#string STR_VAR_POL_STATS_HEADER_1 #language en-US > "+----------------------------------------------------------------+\r\n" > +#string STR_VAR_POL_STATS_HEADER_2 #language en-US "| UEFI > Variable Statistics |\r\n" > +#string STR_VAR_POL_STATS_TOTAL_VARS #language en-US " Total UEFI > Variables: %,d\r\n" > +#string STR_VAR_POL_STATS_TOTAL_SIZE #language en-US " Total UEFI > Variable Size: 0x%x (%,d) bytes\r\n" > + > +#string STR_GET_HELP_VAR_POLICY #language en-US "" > +".TH varpolicy 0 "Lists UEFI variable policy information."\r\n" > +".SH NAME\r\n" > +"Lists UEFI variable policy information.\r\n" > +".SH SYNOPSIS\r\n" > +" \r\n" > +"VARPOLICY [-p] [-s] [-v]\r\n" > +".SH OPTIONS\r\n" > +" \r\n" > +" -p - The policy flag will print variable policy info for each variable.\r\n" > +" \r\n" > +" -s - The stats flag will print overall UEFI variable policy statistics.\r\n" > +" \r\n" > +" -v - The verbose flag indicates all known information should be > printed.\r\n" > +" \r\n" > +" This includes a dump of the corresponding UEFI variable data > in\r\n" > +" addition to all other UEFI variable policy information.\r\n" > +".SH DESCRIPTION\r\n" > +" \r\n" > +".SH EXAMPLES\r\n" > +" \r\n" > +"EXAMPLES:\r\n" > +" * To dump all active UEFI variables:\r\n" > +" fs0:\> varpolicy\r\n" > +"\r\n" > +" * To include UEFI variable policy information:\r\n" > +" fs0:\> varpolicy -p\r\n" > +"\r\n" > +" * To include UEFI variable statistics:\r\n" > +" fs0:\> varpolicy -s\r\n" > +"\r\n" > +" * To include a hexadecimal dump of data for each variable\r\n" > +" and all other variable information:\r\n" > +" fs0:\> varpolicy -v\r\n" > diff --git a/ShellPkg/ShellPkg.dsc b/ShellPkg/ShellPkg.dsc > index dd0d88603f11..c0a8a8f12bd5 100644 > --- a/ShellPkg/ShellPkg.dsc > +++ b/ShellPkg/ShellPkg.dsc > @@ -154,6 +154,7 @@ [Components] > gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE > } > ShellPkg/DynamicCommand/DpDynamicCommand/DpApp.inf > + > ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy > DynamicCommand.inf > ShellPkg/Application/AcpiViewApp/AcpiViewApp.inf >=20 > [BuildOptions] > -- > 2.42.0.windows.2 >=20 >=20 >=20 > -=3D-=3D-=3D-=3D-=3D-=3D > Groups.io Links: You receive all messages sent to this group. > View/Reply Online (#108842): > https://edk2.groups.io/g/devel/message/108842 > Mute This Topic: https://groups.io/mt/101457414/4905953 > Group Owner: devel+owner@edk2.groups.io > Unsubscribe: https://edk2.groups.io/g/devel/unsub > [gaoliming@byosoft.com.cn] > -=3D-=3D-=3D-=3D-=3D-=3D >=20 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#109983): https://edk2.groups.io/g/devel/message/109983 Mute This Topic: https://groups.io/mt/102152515/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-