From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on072c.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe45::72c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 22DEB81E69 for ; Fri, 11 Nov 2016 09:21:26 -0800 (PST) Received: from CS1PR84MB0229.NAMPRD84.PROD.OUTLOOK.COM (10.162.190.151) by CS1PR84MB0230.NAMPRD84.PROD.OUTLOOK.COM (10.162.190.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.707.6; Fri, 11 Nov 2016 17:21:28 +0000 Received: from CS1PR84MB0229.NAMPRD84.PROD.OUTLOOK.COM ([10.162.190.151]) by CS1PR84MB0229.NAMPRD84.PROD.OUTLOOK.COM ([10.162.190.151]) with mapi id 15.01.0707.015; Fri, 11 Nov 2016 17:21:28 +0000 From: "Shah, Tapan" To: Ruiyu Ni , "edk2-devel@lists.01.org" CC: Chen A Chen , Jaben Carsey Thread-Topic: [PATCH] ShellPkg/dmpstore: Support "-sfo" Thread-Index: AQHSPARx6SOehETIA0Wpn+y18R3opqDUB8YQ Date: Fri, 11 Nov 2016 17:21:28 +0000 Message-ID: References: <20161111101410.116396-1-ruiyu.ni@intel.com> In-Reply-To: <20161111101410.116396-1-ruiyu.ni@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=tapandshah@hpe.com; x-originating-ip: [15.203.227.10] x-microsoft-exchange-diagnostics: 1; CS1PR84MB0230; 7:SDdcQB6saftDWJo4WCbEqB+TjcoWCcacSYLDN81x8YmJuELEEejyXof5bKI6VW0JtQwgpiQykpBqJN786UnrzPqfE8XAEybQXI0t8VYG+6m2/0W110fP87zKSHlICsxU8ByneN93NrcMIO6vKGRrEZ6zm1fLrA8fp+mONzn+32Fbt53RTXIUnQ5C0uC+OkYjZ1oRyN4f2pHk+TAhQj4Yvvd3kKaT8Czx9MPkfiQYVoCugdLJjCzqQ5r8CiEN3CO2wnSgnM37o6vMMGsNDvY8o4zsBvpIPdR/ur2IIlXUpyGB9q4iCt2zZuX2f5ktaS/BUl1olZFziI5YuznoGIgqnSsZk8EgG8FiekqXKXZ9tWw= x-ms-office365-filtering-correlation-id: 3b072554-7b1e-4ea3-2c5a-08d40a572c2c x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:CS1PR84MB0230; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(227479698468861)(162533806227266)(228905959029699); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6055026); SRVR:CS1PR84MB0230; BCL:0; PCL:0; RULEID:; SRVR:CS1PR84MB0230; x-forefront-prvs: 012349AD1C x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(6009001)(7916002)(13464003)(377454003)(199003)(189002)(189998001)(2900100001)(229853002)(2950100002)(2501003)(586003)(7696004)(5001770100001)(92566002)(97736004)(3846002)(6116002)(66066001)(102836003)(87936001)(9686002)(7846002)(7736002)(74316002)(305945005)(5660300001)(99286002)(101416001)(106116001)(106356001)(105586002)(8936002)(4326007)(77096005)(3280700002)(86362001)(3660700001)(33656002)(50986999)(68736007)(81156014)(8676002)(81166006)(122556002)(54356999)(76176999)(2906002)(579004)(19627235001); DIR:OUT; SFP:1102; SCL:1; SRVR:CS1PR84MB0230; H:CS1PR84MB0229.NAMPRD84.PROD.OUTLOOK.COM; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; received-spf: None (protection.outlook.com: hpe.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: hpe.com X-MS-Exchange-CrossTenant-originalarrivaltime: 11 Nov 2016 17:21:28.4336 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 105b2061-b669-4b31-92ac-24d304d195dc X-MS-Exchange-Transport-CrossTenantHeadersStamped: CS1PR84MB0230 Subject: Re: [PATCH] ShellPkg/dmpstore: Support "-sfo" X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Nov 2016 17:21:26 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Two comments: 1. Missing help output update for -sfo support in dmpstore command. 2. BinaryToHexString() is missing input parameter NULL and out of bound siz= e check before access. -----Original Message----- From: Ruiyu Ni [mailto:ruiyu.ni@intel.com]=20 Sent: Friday, November 11, 2016 4:14 AM To: edk2-devel@lists.01.org Cc: Chen A Chen ; Jaben Carsey ; Shah, Tapan Subject: [PATCH] ShellPkg/dmpstore: Support "-sfo" The patch adds the "-sfo" support to "dmpstore" command. 1. For "-l" (load variable from file), when the variable content can be updated, the new variable data is displayed in SFO format, otherwise, the new variable data is not displayed. So that the SFO consumer can know which variables are updated by parsing the SFO. 2. For "-d" (delete variable), when the variable can be deleted successfully, only the variable name and GUID are displayed in SFO but the attribute/data/data size are displayed as empty to indicate the deletion happened; otherwise, the variable is not displayed. 3. For displaying variable, when the variable specified by name and GUID cannot be found, an error message is displayed; Otherwise, the SFO is displayed. E.g.: "dmpstore -guid GuidThatDoesntExist -sfo" produces output as: ShellCommand,"dmpstore" VariableInfo,"","GuidThatDoesntExist","","","" "dmpstore NameThatDoesntExist -guid GuidThatDoesntExist -sfo" produces output as: ShellCommand,"dmpstore" dmpstore: No matching variables found. Guid GuidThatDoesntExist, Name NameThatDoesntExist The difference between the above 2 cases is that former one only specifies the GUID, but the latter one specifies both name and GUID. Since not specifying GUID means to use GlobalVariableGuid, "dmpstore NameThatDoesntExist -sfo" produces the similar output as latter one. I personally prefer to always produce SFO output for both cases. But the above behavior is the discussion result between HPE engineers. Signed-off-by: Ruiyu Ni Signed-off-by: Chen A Chen Cc: Jaben Carsey Cc: Tapan Shah --- .../Library/UefiShellDebug1CommandsLib/DmpStore.c | 269 +++++++++++++++--= ---- .../UefiShellDebug1CommandsLib.uni | 5 + 2 files changed, 202 insertions(+), 72 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c b/Shell= Pkg/Library/UefiShellDebug1CommandsLib/DmpStore.c index 3427c99..aa8ad09 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c @@ -2,7 +2,7 @@ Main file for DmpStore shell Debug1 function. =20 (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.
- Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License which accompanies this distribution. The full text of the license may b= e found at @@ -82,12 +82,46 @@ GetAttrType ( } =20 /** + Convert binary to hex format string. + + @param[in] BufferSize The size in bytes of the binary data. + @param[in] Buffer The binary data. + @param[in, out] HexString Hex format string. + @param[in] HexStringSize The size in bytes of the string. + + @return The hex format string. +**/ +CHAR16* +BinaryToHexString ( + IN VOID *Buffer, + IN UINTN BufferSize, + IN OUT CHAR16 *HexString, + IN UINTN HexStringSize + ) +{ + UINTN Index; + UINTN StringIndex; + + for (Index =3D 0, StringIndex =3D 0; Index < BufferSize; Index +=3D 1) { + StringIndex +=3D + UnicodeSPrint ( + &HexString[StringIndex], + HexStringSize - StringIndex * sizeof (CHAR16), + L"%02x", + ((UINT8 *) Buffer)[Index] + ); + } + return HexString; +} + +/** Load the variable data from file and set to variable data base. =20 - @param[in] FileHandle The file to be read. - @param[in] Name The name of the variables to be loaded. - @param[in] Guid The guid of the variables to be loaded. - @param[out] Found TRUE when at least one variable was loaded an= d set. + @param[in] FileHandle The file to be read. + @param[in] Name The name of the variables to be loaded. + @param[in] Guid The guid of the variables to be loaded. + @param[out] Found TRUE when at least one variable was loa= ded and set. + @param[in] StandardFormatOutput TRUE indicates Standard-Format Output. =20 @retval SHELL_DEVICE_ERROR Cannot access the file. @retval SHELL_VOLUME_CORRUPTED The file is in bad format. @@ -99,7 +133,8 @@ LoadVariablesFromFile ( IN SHELL_FILE_HANDLE FileHandle, IN CONST CHAR16 *Name, IN CONST EFI_GUID *Guid, - OUT BOOLEAN *Found + OUT BOOLEAN *Found, + IN BOOLEAN StandardFormatOutput ) { EFI_STATUS Status; @@ -116,6 +151,7 @@ LoadVariablesFromFile ( CHAR16 *Attributes; UINT8 *Buffer; UINT32 Crc32; + CHAR16 *HexString; =20 Status =3D ShellGetFileSize (FileHandle, &FileSize); if (EFI_ERROR (Status)) { @@ -221,11 +257,6 @@ LoadVariablesFromFile ( ((Guid =3D=3D NULL) || CompareGuid (&Variable->Guid, Guid)) ) { Attributes =3D GetAttrType (Variable->Attributes); - ShellPrintHiiEx ( - -1, -1, NULL, STRING_TOKEN(STR_DMPSTORE_HEADER_LINE), gShellDebug1= HiiHandle, - Attributes, &Variable->Guid, Variable->Name, Variable->DataSize - ); - SHELL_FREE_NON_NULL(Attributes); =20 *Found =3D TRUE; Status =3D gRT->SetVariable ( @@ -236,8 +267,38 @@ LoadVariablesFromFile ( Variable->Data ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_= FAIL), gShellDebug1HiiHandle, L"dmpstore", Variable->Name, Status); =20 + if (StandardFormatOutput) { + // + // Supress SFO to indicate the loading is failed. + // + } else { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_FAIL), gShel= lDebug1HiiHandle, + L"dmpstore", Variable->Name, Status + ); + } + } else { + if (StandardFormatOutput) { + HexString =3D AllocatePool ((Variable->DataSize * 2 + 1) * sizeo= f (CHAR16)); + if (HexString !=3D NULL) { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), gShellDeb= ug1HiiHandle, + Variable->Name, &Variable->Guid, Variable->Attributes, Varia= ble->DataSize, + BinaryToHexString ( + Variable->Data, Variable->DataSize, HexString, + (Variable->DataSize * 2 + 1) * sizeof (CHAR16) + ) + ); + FreePool (HexString); + } + } else { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), gShellD= ebug1HiiHandle, + Attributes, &Variable->Guid, Variable->Name, Variable->DataSiz= e + ); + } } + SHELL_FREE_NON_NULL(Attributes); } } =20 @@ -350,14 +411,15 @@ AppendSingleVariableToFile ( =20 This is necessary since once a delete happens GetNextVariableName() will= work. =20 - @param[in] Name The variable name of the EFI variable (or NULL= ). - @param[in] Guid The GUID of the variable set (or NULL). - @param[in] Type The operation type. - @param[in] FileHandle The file to operate on (or NULL). - @param[in] PrevName The previous variable name from GetNextVariabl= eName. L"" to start. - @param[in] FoundVarGuid The previous GUID from GetNextVariableName. ig= nored at start. - @param[in] FoundOne If a VariableName or Guid was specified and on= e was printed or - deleted, then set this to TRUE, otherwise igno= red. + @param[in] Name The variable name of the EFI variable (o= r NULL). + @param[in] Guid The GUID of the variable set (or NULL). + @param[in] Type The operation type. + @param[in] FileHandle The file to operate on (or NULL). + @param[in] PrevName The previous variable name from GetNextV= ariableName. L"" to start. + @param[in] FoundVarGuid The previous GUID from GetNextVariableNa= me. ignored at start. + @param[in] FoundOne If a VariableName or Guid was specified = and one was printed or + deleted, then set this to TRUE, otherwis= e ignored. + @param[in] StandardFormatOutput TRUE indicates Standard-Format Output. =20 @retval SHELL_SUCCESS The operation was successful. @retval SHELL_OUT_OF_RESOURCES A memorty allocation failed. @@ -373,7 +435,8 @@ CascadeProcessVariables ( IN EFI_FILE_PROTOCOL *FileHandle OPTIONAL, IN CONST CHAR16 * CONST PrevName, IN EFI_GUID FoundVarGuid, - IN BOOLEAN *FoundOne + IN BOOLEAN *FoundOne, + IN BOOLEAN StandardFormatOutput ) { EFI_STATUS Status; @@ -383,7 +446,8 @@ CascadeProcessVariables ( UINT32 Atts; SHELL_STATUS ShellStatus; UINTN NameSize; - CHAR16 *RetString; + CHAR16 *AttrString; + CHAR16 *HexString; =20 if (ShellGetExecutionBreakFlag()) { return (SHELL_ABORTED); @@ -427,7 +491,7 @@ CascadeProcessVariables ( // // Recurse to the next iteration. We know "our" variable's name. // - ShellStatus =3D CascadeProcessVariables(Name, Guid, Type, FileHandle, Fo= undVarName, FoundVarGuid, FoundOne); + ShellStatus =3D CascadeProcessVariables (Name, Guid, Type, FileHandle, F= oundVarName, FoundVarGuid, FoundOne, StandardFormatOutput); =20 if (ShellGetExecutionBreakFlag() || (ShellStatus =3D=3D SHELL_ABORTED)) = { SHELL_FREE_NON_NULL(FoundVarName); @@ -459,50 +523,86 @@ CascadeProcessVariables ( Status =3D gRT->GetVariable (FoundVarName, &FoundVarGuid, &Atts, &= DataSize, DataBuffer); } } - if ((Type =3D=3D DmpStoreDisplay) || (Type =3D=3D DmpStoreSave)) { // // Last error check then print this variable out. // + if (Type =3D=3D DmpStoreDisplay) { + if (!EFI_ERROR(Status) && (DataBuffer !=3D NULL) && (FoundVarName != =3D NULL)) { + AttrString =3D GetAttrType(Atts); + if (StandardFormatOutput) { + HexString =3D AllocatePool ((DataSize * 2 + 1) * sizeof (CHAR16)= ); + if (HexString !=3D NULL) { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), gShellDeb= ug1HiiHandle, + FoundVarName, &FoundVarGuid, Atts, DataSize, + BinaryToHexString ( + DataBuffer, DataSize, HexString, (DataSize * 2 + 1) * size= of (CHAR16) + ) + ); + FreePool (HexString); + } else { + Status =3D EFI_OUT_OF_RESOURCES; + } + } else { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), gShellD= ebug1HiiHandle, + AttrString, &FoundVarGuid, FoundVarName, DataSize + ); + DumpHex (2, 0, DataSize, DataBuffer); + } + SHELL_FREE_NON_NULL (AttrString); + } + } else if (Type =3D=3D DmpStoreSave) { if (!EFI_ERROR(Status) && (DataBuffer !=3D NULL) && (FoundVarName != =3D NULL)) { - RetString =3D GetAttrType(Atts); - ShellPrintHiiEx( - -1, - -1, - NULL, - STRING_TOKEN(STR_DMPSTORE_HEADER_LINE), - gShellDebug1HiiHandle, - RetString, - &FoundVarGuid, - FoundVarName, - DataSize); - if (Type =3D=3D DmpStoreDisplay) { - DumpHex(2, 0, DataSize, DataBuffer); + AttrString =3D GetAttrType (Atts); + if (StandardFormatOutput) { + HexString =3D AllocatePool ((DataSize * 2 + 1) * sizeof (CHAR16)= ); + if (HexString !=3D NULL) { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), gShellDeb= ug1HiiHandle, + FoundVarName, &FoundVarGuid, Atts, DataSize, + BinaryToHexString ( + DataBuffer, DataSize, HexString, (DataSize * 2 + 1) * size= of (CHAR16) + ) + ); + FreePool (HexString); + } else { + Status =3D EFI_OUT_OF_RESOURCES; + } } else { - Status =3D AppendSingleVariableToFile ( - FileHandle, - FoundVarName, - &FoundVarGuid, - Atts, - (UINT32) DataSize, - DataBuffer - ); + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), gShellD= ebug1HiiHandle, + AttrString, &FoundVarGuid, FoundVarName, DataSize + ); } - SHELL_FREE_NON_NULL(RetString); + Status =3D AppendSingleVariableToFile ( + FileHandle, + FoundVarName, + &FoundVarGuid, + Atts, + (UINT32) DataSize, + DataBuffer + ); + SHELL_FREE_NON_NULL (AttrString); } } else if (Type =3D=3D DmpStoreDelete) { // // We only need name to delete it... // - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN(STR_DMPSTORE_DELETE_LINE), - gShellDebug1HiiHandle, - &FoundVarGuid, - FoundVarName, - gRT->SetVariable (FoundVarName, &FoundVarGuid, Atts, 0, NULL) - ); + EFI_STATUS SetStatus =3D gRT->SetVariable (FoundVarName, &FoundVarGu= id, Atts, 0, NULL); + if (StandardFormatOutput) { + if (SetStatus =3D=3D EFI_SUCCESS) { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_NG_SFO),= gShellDebug1HiiHandle, + FoundVarName, &FoundVarGuid + ); + } + } else { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_DELETE_LINE), gShellDeb= ug1HiiHandle, + &FoundVarGuid, FoundVarName, SetStatus + ); + } } SHELL_FREE_NON_NULL(DataBuffer); } @@ -523,10 +623,11 @@ CascadeProcessVariables ( /** Function to display or delete variables. This will set up and call into= the recursive function. =20 - @param[in] Name The variable name of the EFI variable (or NULL). - @param[in] Guid The GUID of the variable set (or NULL). - @param[in] Type The operation type. - @param[in] FileHandle The file to save or load variables. + @param[in] Name The variable name of the EFI variable (o= r NULL). + @param[in] Guid The GUID of the variable set (or NULL). + @param[in] Type The operation type. + @param[in] FileHandle The file to save or load variables. + @param[in] StandardFormatOutput TRUE indicates Standard-Format Output. =20 @retval SHELL_SUCCESS The operation was successful. @retval SHELL_OUT_OF_RESOURCES A memorty allocation failed. @@ -539,7 +640,8 @@ ProcessVariables ( IN CONST CHAR16 *Name OPTIONAL, IN CONST EFI_GUID *Guid OPTIONAL, IN DMP_STORE_TYPE Type, - IN SHELL_FILE_HANDLE FileHandle OPTIONAL + IN SHELL_FILE_HANDLE FileHandle OPTIONAL, + IN BOOLEAN StandardFormatOutput ) { SHELL_STATUS ShellStatus; @@ -550,10 +652,14 @@ ProcessVariables ( ShellStatus =3D SHELL_SUCCESS; ZeroMem (&FoundVarGuid, sizeof(EFI_GUID)); =20 + if (StandardFormatOutput) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_GEN_SFO_HEADER), gShell= Debug1HiiHandle, L"dmpstore"); + } + if (Type =3D=3D DmpStoreLoad) { - ShellStatus =3D LoadVariablesFromFile (FileHandle, Name, Guid, &Found)= ; + ShellStatus =3D LoadVariablesFromFile (FileHandle, Name, Guid, &Found,= StandardFormatOutput); } else { - ShellStatus =3D CascadeProcessVariables(Name, Guid, Type, FileHandle, = NULL, FoundVarGuid, &Found); + ShellStatus =3D CascadeProcessVariables (Name, Guid, Type, FileHandle,= NULL, FoundVarGuid, &Found, StandardFormatOutput); } =20 if (!Found) { @@ -561,13 +667,25 @@ ProcessVariables ( ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShell= Debug1HiiHandle, L"dmpstore"); =20 return (ShellStatus); } else if (Name !=3D NULL && Guid =3D=3D NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUN= D_N), gShellDebug1HiiHandle, L"dmpstore", Name); =20 + if (StandardFormatOutput) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_F= OUND_N_SFO), gShellDebug1HiiHandle, Name); + } else { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_F= OUND_N), gShellDebug1HiiHandle, L"dmpstore", Name); =20 + } } else if (Name !=3D NULL && Guid !=3D NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUN= D_GN), gShellDebug1HiiHandle, L"dmpstore", Guid, Name); =20 } else if (Name =3D=3D NULL && Guid =3D=3D NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUN= D), gShellDebug1HiiHandle, L"dmpstore"); =20 + if (StandardFormatOutput) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_F= OUND_SFO), gShellDebug1HiiHandle); + } else { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_F= OUND), gShellDebug1HiiHandle, L"dmpstore"); + } } else if (Name =3D=3D NULL && Guid !=3D NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUN= D_G), gShellDebug1HiiHandle, L"dmpstore", Guid); =20 + if (StandardFormatOutput) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_F= OUND_G_SFO), gShellDebug1HiiHandle, Guid); + } else { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_F= OUND_G), gShellDebug1HiiHandle, L"dmpstore", Guid); + } }=20 return (SHELL_NOT_FOUND); } @@ -580,6 +698,7 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] =3D { {L"-s", TypeValue}, {L"-all", TypeFlag}, {L"-guid", TypeValue}, + {L"-sfo", TypeFlag}, {NULL, TypeMax} }; =20 @@ -608,12 +727,14 @@ ShellCommandRunDmpStore ( DMP_STORE_TYPE Type; SHELL_FILE_HANDLE FileHandle; EFI_FILE_INFO *FileInfo; + BOOLEAN StandardFormatOutput; =20 - ShellStatus =3D SHELL_SUCCESS; - Package =3D NULL; - FileHandle =3D NULL; - File =3D NULL; - Type =3D DmpStoreDisplay; + ShellStatus =3D SHELL_SUCCESS; + Package =3D NULL; + FileHandle =3D NULL; + File =3D NULL; + Type =3D DmpStoreDisplay; + StandardFormatOutput =3D FALSE; =20 Status =3D ShellCommandLineParse (ParamList, &Package, &ProblemParam, TR= UE); if (EFI_ERROR(Status)) { @@ -742,6 +863,10 @@ ShellCommandRunDmpStore ( } else if (ShellCommandLineGetFlag(Package, L"-d")) { Type =3D DmpStoreDelete; } + + if (ShellCommandLineGetFlag (Package,L"-sfo")) { + StandardFormatOutput =3D TRUE; + } } =20 if (ShellStatus =3D=3D SHELL_SUCCESS) { @@ -750,7 +875,7 @@ ShellCommandRunDmpStore ( } else if (Type =3D=3D DmpStoreLoad) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD),= gShellDebug1HiiHandle, File); } - ShellStatus =3D ProcessVariables (Name, Guid, Type, FileHandle); + ShellStatus =3D ProcessVariables (Name, Guid, Type, FileHandle, St= andardFormatOutput); if ((Type =3D=3D DmpStoreLoad) || (Type =3D=3D DmpStoreSave)) { ShellCloseFile (&FileHandle); } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Com= mandsLib.uni b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1C= ommandsLib.uni index 52c2af0..c97bd62 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLi= b.uni +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLi= b.uni @@ -407,9 +407,14 @@ #string STR_DMPSTORE_HEADER_LINE #language en-US "Variable %H%s%N '%= H%g%N:%H%s%N' DataSize =3D 0x%02x\r\n" #string STR_DMPSTORE_DELETE_LINE #language en-US "Delete variable '%= H%g%N:%H%s%N': %r\r\n" #string STR_DMPSTORE_NO_VAR_FOUND #language en-US "%H%s%N: No matchin= g variables found.\r\n" +#string STR_DMPSTORE_NO_VAR_FOUND_SFO #language en-US "VariableInfo,\"\",= \"\",\"\",\"\",\"\"\r\n" #string STR_DMPSTORE_NO_VAR_FOUND_GN #language en-US "%H%s%N: No matchin= g variables found. Guid %g, Name %s\r\n" +#string STR_DMPSTORE_NO_VAR_FOUND_NG_SFO #language en-US "VariableInfo,\"%= s\",\"%g\",\"\",\"\",\"\"\r\n" #string STR_DMPSTORE_NO_VAR_FOUND_N #language en-US "%H%s%N: No matchin= g variables found. Name %s\r\n" +#string STR_DMPSTORE_NO_VAR_FOUND_N_SFO #language en-US #language en-US "V= ariableInfo,\"%s\",\"\",\"\",\"\",\"\"\r\n" #string STR_DMPSTORE_NO_VAR_FOUND_G #language en-US "%H%s%N: No matchin= g variables found. Guid %g\r\n" +#string STR_DMPSTORE_NO_VAR_FOUND_G_SFO #language en-US "VariableInfo,\"\"= ,\"%g\",\"\",\"\",\"\"\r\n" +#string STR_DMPSTORE_VAR_SFO #language en-US "VariableInfo,\"%s\= ",\"%g\",\"0x%x\",\"0x%x\",\"%s\"\r\n" =20 #string STR_GET_HELP_COMP #language en-US "" ".TH comp 0 "Compare 2 files"\r\n" --=20 2.9.0.windows.1