From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 76C1F81C9A for ; Sun, 13 Nov 2016 18:24:55 -0800 (PST) Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga102.fm.intel.com with ESMTP; 13 Nov 2016 18:24:59 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,488,1473145200"; d="scan'208";a="30675294" Received: from fmsmsx104.amr.corp.intel.com ([10.18.124.202]) by orsmga004.jf.intel.com with ESMTP; 13 Nov 2016 18:24:59 -0800 Received: from fmsmsx115.amr.corp.intel.com (10.18.116.19) by fmsmsx104.amr.corp.intel.com (10.18.124.202) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sun, 13 Nov 2016 18:24:59 -0800 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by fmsmsx115.amr.corp.intel.com (10.18.116.19) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sun, 13 Nov 2016 18:24:58 -0800 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.142]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.96]) with mapi id 14.03.0248.002; Mon, 14 Nov 2016 10:24:55 +0800 From: "Ni, Ruiyu" To: "Shah, Tapan" , "edk2-devel@lists.01.org" CC: "Chen, Chen A" , "Carsey, Jaben" Thread-Topic: [PATCH] ShellPkg/dmpstore: Support "-sfo" Thread-Index: AQHSPEAW5npsPzjXAUmvUt3GROaIz6DXw80Q Date: Mon, 14 Nov 2016 02:24:55 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D58E76CF9@SHSMSX104.ccr.corp.intel.com> References: <20161111101410.116396-1-ruiyu.ni@intel.com> In-Reply-To: Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 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: Mon, 14 Nov 2016 02:24:55 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Comments below. Thanks/Ray > -----Original Message----- > From: Shah, Tapan [mailto:tapandshah@hpe.com] > Sent: Saturday, November 12, 2016 1:21 AM > To: Ni, Ruiyu ; edk2-devel@lists.01.org > Cc: Chen, Chen A ; Carsey, Jaben > > Subject: RE: [PATCH] ShellPkg/dmpstore: Support "-sfo" >=20 > Two comments: > 1. Missing help output update for -sfo support in dmpstore command. Thanks for catching that. Will do that in V2 patch. > 2. BinaryToHexString() is missing input parameter NULL and out of bound s= ize > check before access. Will add assertion in V2 patch. Assertion is enough since it's internal fun= ction. >=20 > -----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" >=20 > The patch adds the "-sfo" support to "dmpstore" command. >=20 > 1. For "-l" (load variable from file), when the variable content can be u= pdated, > the new variable data is displayed in SFO format, otherwise, the new vari= able > data is not displayed. So that the SFO consumer can know which variables = are > updated by parsing the SFO. >=20 > 2. For "-d" (delete variable), when the variable can be deleted successfu= lly, > 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. >=20 > 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","","","" >=20 > "dmpstore NameThatDoesntExist -guid GuidThatDoesntExist -sfo" > produces output as: > ShellCommand,"dmpstore" > dmpstore: No matching variables found. Guid GuidThatDoesntExist, Name > NameThatDoesntExist >=20 > The difference between the above 2 cases is that former one only specifie= s > 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. >=20 > 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(-) >=20 > diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c > b/ShellPkg/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 = BSD > License > which accompanies this distribution. The full text of the license may= be > 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 = and > set. > + @param[in] FileHandle The file to be read. > + @param[in] Name The name of the variables to be loade= d. > + @param[in] Guid The guid of the variables to be loade= d. > + @param[out] Found TRUE when at least one variable was l= oaded > 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), > gShellDebug1HiiHandle, > - 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); > + if (StandardFormatOutput) { > + // > + // Supress SFO to indicate the loading is failed. > + // > + } else { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_FAIL), > gShellDebug1HiiHandle, > + L"dmpstore", Variable->Name, Status > + ); > + } > + } else { > + if (StandardFormatOutput) { > + HexString =3D AllocatePool ((Variable->DataSize * 2 + 1) * siz= eof > (CHAR16)); > + if (HexString !=3D NULL) { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), > gShellDebug1HiiHandle, > + Variable->Name, &Variable->Guid, Variable->Attributes, Var= iable- > >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), > gShellDebug1HiiHandle, > + Attributes, &Variable->Guid, Variable->Name, Variable->DataS= ize > + ); > + } > } > + SHELL_FREE_NON_NULL(Attributes); > } > } >=20 > @@ -350,14 +411,15 @@ AppendSingleVariableToFile ( >=20 > This is necessary since once a delete happens GetNextVariableName() wi= ll > work. >=20 > - @param[in] Name The variable name of the EFI variable (or NU= LL). > - @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 > GetNextVariableName. L"" to start. > - @param[in] FoundVarGuid The previous GUID from > GetNextVariableName. ignored at start. > - @param[in] FoundOne If a VariableName or Guid was specified and = one > was printed or > - deleted, then set this to TRUE, otherwise ig= nored. > + @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 > GetNextVariableName. L"" to start. > + @param[in] FoundVarGuid The previous GUID from > GetNextVariableName. ignored at start. > + @param[in] FoundOne If a VariableName or Guid was specifie= d and > one was printed or > + deleted, then set this to TRUE, otherw= ise 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, > FoundVarName, FoundVarGuid, FoundOne); > + ShellStatus =3D CascadeProcessVariables (Name, Guid, Type, FileHandle, > + 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 (CHAR1= 6)); > + if (HexString !=3D NULL) { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), > gShellDebug1HiiHandle, > + FoundVarName, &FoundVarGuid, Atts, DataSize, > + BinaryToHexString ( > + DataBuffer, DataSize, HexString, (DataSize * 2 + 1) * si= zeof (CHAR16) > + ) > + ); > + FreePool (HexString); > + } else { > + Status =3D EFI_OUT_OF_RESOURCES; > + } > + } else { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), > gShellDebug1HiiHandle, > + 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 (CHAR1= 6)); > + if (HexString !=3D NULL) { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_VAR_SFO), > gShellDebug1HiiHandle, > + FoundVarName, &FoundVarGuid, Atts, DataSize, > + BinaryToHexString ( > + DataBuffer, DataSize, HexString, (DataSize * 2 + 1) * si= zeof (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), > gShellDebug1HiiHandle, > + 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, > &FoundVarGuid, 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), > gShellDebug1HiiHandle, > + &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 in= to 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 = (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] 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), > + gShellDebug1HiiHandle, L"dmpstore"); } > + > if (Type =3D=3D DmpStoreLoad) { > - ShellStatus =3D LoadVariablesFromFile (FileHandle, Name, Guid, &Foun= d); > + 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), > gShellDebug1HiiHandle, L"dmpstore"); > return (ShellStatus); > } else if (Name !=3D NULL && Guid =3D=3D NULL) { > - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND_N), gShellDebug1HiiHandle, > L"dmpstore", Name); > + if (StandardFormatOutput) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND_N_SFO), gShellDebug1HiiHandle, > Name); > + } else { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND_N), gShellDebug1HiiHandle, > L"dmpstore", Name); > + } > } else if (Name !=3D NULL && Guid !=3D NULL) { > ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND_GN), gShellDebug1HiiHandle, > L"dmpstore", Guid, Name); > } else if (Name =3D=3D NULL && Guid =3D=3D NULL) { > - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND), gShellDebug1HiiHandle, L"dmpstore"); > + if (StandardFormatOutput) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND_SFO), gShellDebug1HiiHandle); > + } else { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND), gShellDebug1HiiHandle, L"dmpstore"); > + } > } else if (Name =3D=3D NULL && Guid !=3D NULL) { > - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND_G), gShellDebug1HiiHandle, > L"dmpstore", Guid); > + if (StandardFormatOutput) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND_G_SFO), gShellDebug1HiiHandle, Guid); > + } else { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN > (STR_DMPSTORE_NO_VAR_FOUND_G), gShellDebug1HiiHandle, > L"dmpstore", Guid); > + } > } > 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, > TRUE); > 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, > + StandardFormatOutput); > if ((Type =3D=3D DmpStoreLoad) || (Type =3D=3D DmpStoreSave)) { > ShellCloseFile (&FileHandle); > } > diff --git > a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Comman > dsLib.uni > b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Comman > dsLib.uni > index 52c2af0..c97bd62 100644 > --- > a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Comman > dsLib.uni > +++ > b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Comman > d > +++ 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 matching 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 matching 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 matching variables found. Name %s\r\n" > +#string STR_DMPSTORE_NO_VAR_FOUND_N_SFO #language en-US > #language en-US "VariableInfo,\"%s\",\"\",\"\",\"\",\"\"\r\n" > #string STR_DMPSTORE_NO_VAR_FOUND_G #language en-US "%H%s%N: > No matching 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 >=20