From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0704.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe41::704]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A81B381EDD for ; Fri, 11 Nov 2016 12:43:21 -0800 (PST) Received: from CS1PR84MB0229.NAMPRD84.PROD.OUTLOOK.COM (10.162.190.151) by CS1PR84MB0134.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.25) 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 20:43:22 +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 20:43:22 +0000 From: "Shah, Tapan" To: Ruiyu Ni , "edk2-devel@lists.01.org" , "Phillips, Chris J (Plano, TX)" CC: Chen A Chen , Jaben Carsey Thread-Topic: [PATCH] ShellPkg/dmpstore: Support "-sfo" Thread-Index: AQHSPARx6SOehETIA0Wpn+y18R3opqDUB8YQgAA1RpA= Date: Fri, 11 Nov 2016 20:43:22 +0000 Message-ID: References: <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; CS1PR84MB0134; 7:fIAmACtxMw0Z79+oxgQgCPEu68Gml62JC3BDcceLciYR3uN2eMrgnxBhr0yvs+rcdVALsS9xwh9Vzs5BZ4MsKCOG1+msTDCCn9isY0ff/vILCQV/1LxnmcvBGSvm9x0yhrCbsoLQE8mQufDhDYX7Ge99uUgoxnu7GsupVTw6S2zdSHYcF40r5Hn5L4SYUzGIOGe6Rr4hDAPHUO8hFJWdyad93I59qFDVxJfln/3kEpUDWIFuHfX28tgsttRpu6e2HYnciMqKMEiSesLNVYorJasnu8CpIasbqhdHUt3c0n/UojKVvYvow7OAcUQBKR/Q+JIVscG5B/z0dl9oUxNQCdZW5HFtLX7OOsk+lSBbc+8= x-forefront-antispam-report: SFV:SKI; SCL:-1SFV:NSPM; SFS:(10019020)(6009001)(7916002)(199003)(377454003)(189002)(13464003)(122556002)(5660300001)(7696004)(92566002)(6636002)(102836003)(3846002)(6116002)(9686002)(101416001)(68736007)(586003)(86362001)(3660700001)(74316002)(305945005)(3280700002)(7846002)(33656002)(7736002)(3900700001)(77096005)(5001770100001)(97736004)(189998001)(2501003)(106356001)(87936001)(81166006)(76176999)(50986999)(99286002)(106116001)(105586002)(54356999)(2900100001)(8936002)(81156014)(66066001)(8676002)(229853002)(2906002)(4326007)(579004)(19627235001); DIR:OUT; SFP:1102; SCL:1; SRVR:CS1PR84MB0134; H:CS1PR84MB0229.NAMPRD84.PROD.OUTLOOK.COM; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; x-ms-office365-filtering-correlation-id: e97bd70a-4e94-4d03-b937-08d40a736084 x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:CS1PR84MB0134; 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)(3002001)(10201501046)(6055026); SRVR:CS1PR84MB0134; BCL:0; PCL:0; RULEID:; SRVR:CS1PR84MB0134; x-forefront-prvs: 012349AD1C 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 20:43:22.1208 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 105b2061-b669-4b31-92ac-24d304d195dc X-MS-Exchange-Transport-CrossTenantHeadersStamped: CS1PR84MB0134 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 20:43:22 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Ray, Chris and I looked at the patch closely again and saw that your change a= lso includes -sfo support for -l and -s flags which is not supported accord= ing to the latest spec. See below syntax from spec: dmpstore [-b] [-d] [-all | (-guid guid)] [variable] [-sfo] dmpstore [-all | (-guid guid)] [variable] [-s file] dmpstore [-all | (-guid guid)] [variable] [-l file] If we want to include -l and -s support with -sfo flag, then we need to def= ine new SFO tables and it requires UEFI Shell spec. update. Currently non-s= fo mode for -l and -s flags do not display variable data and current -sfo t= able has variable data column defined. We also saw that -l/-s -sfo mode suppresses error and that's confusing from= user prospective as suppressing error does not provide enough information = to user about what happened for an individual variable. This should be hand= led with new SFO tables for -l/-s flags and do it later after Shell spec. u= pdate. Thanks, Tapan -----Original Message----- From: Shah, Tapan=20 Sent: Friday, November 11, 2016 11:21 AM To: 'Ruiyu Ni' ; edk2-devel@lists.01.org Cc: Chen A Chen ; Jaben Carsey Subject: RE: [PATCH] ShellPkg/dmpstore: Support "-sfo" 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] 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 upd= ated, 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 var= iables are updated by parsing the SFO. 2. For "-d" (delete variable), when the variable can be deleted successfull= y, only the variable name and GUID are displayed in SFO but the attribute/d= ata/data size are displayed as empty to indicate the deletion happened; oth= erwise, the variable is not displayed. 3. For displaying variable, when the variable specified by name and GUID ca= nnot be found, an error message is displayed; Otherwise, the SFO is display= ed. 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 NameT= hatDoesntExist 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 NameTh= atDoesntExist -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=20 + 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,=20 + FoundVarName, 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),=20 + gShellDebug1HiiHandle, L"dmpstore"); } + if (Type =3D=3D DmpStoreLoad) { - ShellStatus =3D LoadVariablesFromFile (FileHandle, Name, Guid, &Found)= ; + ShellStatus =3D LoadVariablesFromFile (FileHandle, Name, Guid,=20 + &Found, StandardFormatOutput); } else { - ShellStatus =3D CascadeProcessVariables(Name, Guid, Type, FileHandle, = NULL, FoundVarGuid, &Found); + ShellStatus =3D CascadeProcessVariables (Name, Guid, Type,=20 + 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 @@ ShellCom= mandRunDmpStore ( } 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,=20 + StandardFormatOutput); 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/UefiShellDebug1Command +++ sLib.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" -- 2.9.0.windows.1