From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 E40E521A04811 for ; Thu, 13 Apr 2017 19:36:04 -0700 (PDT) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Apr 2017 19:36:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.37,195,1488873600"; d="scan'208";a="845891797" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by FMSMGA003.fm.intel.com with ESMTP; 13 Apr 2017 19:36:03 -0700 Received: from fmsmsx112.amr.corp.intel.com (10.18.116.6) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 13 Apr 2017 19:36:03 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX112.amr.corp.intel.com (10.18.116.6) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 13 Apr 2017 19:36:02 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.246]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.117]) with mapi id 14.03.0319.002; Fri, 14 Apr 2017 10:36:00 +0800 From: "Yao, Jiewen" To: "Zeng, Star" , "edk2-devel@lists.01.org" CC: "Tian, Feng" Thread-Topic: [PATCH] MdeModulePkg CapsuleApp: Add directory support Thread-Index: AQHStBcIYKJwBlRTe0yvlxasJKjv5aHEJ3uQ Date: Fri, 14 Apr 2017 02:36:00 +0000 Message-ID: <74D8A39837DF1E4DA445A8C0B3885C503A92C36A@shsmsx102.ccr.corp.intel.com> References: <1492061398-30996-1-git-send-email-star.zeng@intel.com> In-Reply-To: <1492061398-30996-1-git-send-email-star.zeng@intel.com> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 10.0.102.7 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH] MdeModulePkg CapsuleApp: Add directory support X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Apr 2017 02:36:05 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: jiewen.yao@intel.com > -----Original Message----- > From: Zeng, Star > Sent: Thursday, April 13, 2017 1:30 PM > To: edk2-devel@lists.01.org > Cc: Zeng, Star ; Yao, Jiewen ;= Tian, > Feng > Subject: [PATCH] MdeModulePkg CapsuleApp: Add directory support >=20 > Current CapsuleApp only supports input/output file from rootdirectory. > If the CapsuleApp and related file are put into subdirectory, > below message will be shown when running the CapsuleApp in shell. >=20 > "CapsuleApp: capsule image (Capsule image file name) is not found." >=20 > This patch is to add directory support for CapsuleApp > by using shell protocol. >=20 > Cc: Jiewen Yao > Cc: Feng Tian > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Star Zeng > --- > MdeModulePkg/Application/CapsuleApp/AppSupport.c | 380 > +++++---------------- > MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 9 +- > MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf | 7 +- > 3 files changed, 94 insertions(+), 302 deletions(-) >=20 > diff --git a/MdeModulePkg/Application/CapsuleApp/AppSupport.c > b/MdeModulePkg/Application/CapsuleApp/AppSupport.c > index e39ab2037865..fc27343736a4 100644 > --- a/MdeModulePkg/Application/CapsuleApp/AppSupport.c > +++ b/MdeModulePkg/Application/CapsuleApp/AppSupport.c > @@ -18,22 +18,14 @@ > #include > #include > #include > -#include > -#include > -#include > -#include > #include > #include > +#include > #include > -#include > - > -#define IS_HYPHEN(a) ((a) =3D=3D L'-') > -#define IS_NULL(a) ((a) =3D=3D L'\0') > - > -#define MAX_ARG_NUM 11 >=20 > UINTN Argc; > CHAR16 **Argv; > +EFI_SHELL_PROTOCOL *mShellProtocol =3D NULL; >=20 > /** >=20 > @@ -64,141 +56,103 @@ GetArg ( > } >=20 > /** > - Return File System Volume containing this shell application. > + Get shell protocol. >=20 > - @return File System Volume containing this shell application. > + @return Pointer to shell protocol. > **/ > -EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * > -GetMyVol ( > +EFI_SHELL_PROTOCOL * > +GetShellProtocol ( > VOID > ) > { > - EFI_STATUS Status; > - EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol; > - > - Status =3D gBS->HandleProtocol ( > - gImageHandle, > - &gEfiLoadedImageProtocolGuid, > - (VOID **)&LoadedImage > - ); > - ASSERT_EFI_ERROR (Status); > + EFI_STATUS Status; >=20 > - Status =3D gBS->HandleProtocol ( > - LoadedImage->DeviceHandle, > - &gEfiSimpleFileSystemProtocolGuid, > - (VOID **)&Vol > - ); > - if (!EFI_ERROR (Status)) { > - return Vol; > + if (mShellProtocol =3D=3D NULL) { > + Status =3D gBS->LocateProtocol ( > + &gEfiShellProtocolGuid, > + NULL, > + (VOID **) &mShellProtocol > + ); > + if (EFI_ERROR (Status)) { > + mShellProtocol =3D NULL; > + } > } >=20 > - return NULL; > + return mShellProtocol; > } >=20 > /** > - Read a file from this volume. > + Read a file. >=20 > - @param[in] Vol File System Volume > @param[in] FileName The file to be read. > @param[out] BufferSize The file buffer size > @param[out] Buffer The file buffer >=20 > @retval EFI_SUCCESS Read file successfully > - @retval EFI_NOT_FOUND File not found > + @retval EFI_NOT_FOUND Shell protocol or file not found > + @retval others Read file failed > **/ > EFI_STATUS > -ReadFileFromVol ( > - IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol, > - IN CHAR16 *FileName, > - OUT UINTN *BufferSize, > - OUT VOID **Buffer > +ReadFileToBuffer ( > + IN CHAR16 *FileName, > + OUT UINTN *BufferSize, > + OUT VOID **Buffer > ) > { > EFI_STATUS Status; > - EFI_FILE_HANDLE RootDir; > - EFI_FILE_HANDLE Handle; > - UINTN FileInfoSize; > - EFI_FILE_INFO *FileInfo; > + EFI_SHELL_PROTOCOL *ShellProtocol; > + SHELL_FILE_HANDLE Handle; > + UINT64 FileSize; > UINTN TempBufferSize; > VOID *TempBuffer; >=20 > - // > - // Open the root directory > - // > - Status =3D Vol->OpenVolume (Vol, &RootDir); > - if (EFI_ERROR (Status)) { > - return Status; > + ShellProtocol =3D GetShellProtocol(); > + if (ShellProtocol =3D=3D NULL) { > + return EFI_NOT_FOUND; > } >=20 > // > - // Open the file > + // Open file by FileName. > // > - Status =3D RootDir->Open ( > - RootDir, > - &Handle, > - FileName, > - EFI_FILE_MODE_READ, > - 0 > - ); > + Status =3D ShellProtocol->OpenFileByName ( > + FileName, > + &Handle, > + EFI_FILE_MODE_READ > + ); > if (EFI_ERROR (Status)) { > - RootDir->Close (RootDir); > return Status; > } >=20 > - RootDir->Close (RootDir); > - > // > - // Get the file information > + // Get the file size. > // > - FileInfoSize =3D sizeof(EFI_FILE_INFO) + 1024; > - > - FileInfo =3D AllocateZeroPool (FileInfoSize); > - if (FileInfo =3D=3D NULL) { > - Handle->Close (Handle); > + Status =3D ShellProtocol->GetFileSize (Handle, &FileSize); > + if (EFI_ERROR (Status)) { > + ShellProtocol->CloseFile (Handle); > return Status; > } >=20 > - Status =3D Handle->GetInfo ( > - Handle, > - &gEfiFileInfoGuid, > - &FileInfoSize, > - FileInfo > - ); > - if (EFI_ERROR (Status)) { > - Handle->Close (Handle); > - gBS->FreePool (FileInfo); > - return Status; > - } > - > - // > - // Allocate buffer for the file data. The last CHAR16 is for L'\0' > - // > - TempBufferSize =3D (UINTN) FileInfo->FileSize + sizeof(CHAR16); > + TempBufferSize =3D (UINTN) FileSize; > TempBuffer =3D AllocateZeroPool (TempBufferSize); > if (TempBuffer =3D=3D NULL) { > - Handle->Close (Handle); > - gBS->FreePool (FileInfo); > - return Status; > + ShellProtocol->CloseFile (Handle); > + return EFI_OUT_OF_RESOURCES; > } >=20 > - gBS->FreePool (FileInfo); > - > // > // Read the file data to the buffer > // > - Status =3D Handle->Read ( > - Handle, > - &TempBufferSize, > - TempBuffer > - ); > + Status =3D ShellProtocol->ReadFile ( > + Handle, > + &TempBufferSize, > + TempBuffer > + ); > if (EFI_ERROR (Status)) { > - Handle->Close (Handle); > - gBS->FreePool (TempBuffer); > + ShellProtocol->CloseFile (Handle); > return Status; > } >=20 > - Handle->Close (Handle); > + ShellProtocol->CloseFile (Handle); >=20 > *BufferSize =3D TempBufferSize; > *Buffer =3D TempBuffer; > @@ -206,156 +160,6 @@ ReadFileFromVol ( > } >=20 > /** > - Read a file. > - If ScanFs is FLASE, it will use this Vol as default Fs. > - If ScanFs is TRUE, it will scan all FS and check the file. > - If there is only one file match the name, it will be read. > - If there is more than one file match the name, it will return Error. > - > - @param[in,out] ThisVol File System Volume > - @param[in] FileName The file to be read. > - @param[out] BufferSize The file buffer size > - @param[out] Buffer The file buffer > - @param[in] ScanFs Need Scan all FS > - > - @retval EFI_SUCCESS Read file successfully > - @retval EFI_NOT_FOUND File not found > - @retval EFI_NO_MAPPING There is duplicated files found > -**/ > -EFI_STATUS > -ReadFileToBufferEx ( > - IN OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **ThisVol, > - IN CHAR16 *FileName, > - OUT UINTN *BufferSize, > - OUT VOID **Buffer, > - IN BOOLEAN ScanFs > - ) > -{ > - EFI_STATUS Status; > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol; > - UINTN TempBufferSize; > - VOID *TempBuffer; > - UINTN NoHandles; > - EFI_HANDLE *HandleBuffer; > - UINTN Index; > - > - // > - // Check parameters > - // > - if ((FileName =3D=3D NULL) || (Buffer =3D=3D NULL) || (ThisVol =3D=3D = NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // not scan fs > - // > - if (!ScanFs) { > - if (*ThisVol =3D=3D NULL) { > - *ThisVol =3D GetMyVol (); > - if (*ThisVol =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - } > - // > - // Read file directly from Vol > - // > - return ReadFileFromVol (*ThisVol, FileName, BufferSize, Buffer); > - } > - > - // > - // need scan fs > - // > - > - // > - // Get all Vol handle > - // > - Status =3D gBS->LocateHandleBuffer ( > - ByProtocol, > - &gEfiSimpleFileSystemProtocolGuid, > - NULL, > - &NoHandles, > - &HandleBuffer > - ); > - if (EFI_ERROR (Status) && (NoHandles =3D=3D 0)) { > - return EFI_NOT_FOUND; > - } > - > - // > - // Walk through each Vol > - // > - *ThisVol =3D NULL; > - *BufferSize =3D 0; > - *Buffer =3D NULL; > - for (Index =3D 0; Index < NoHandles; Index++) { > - Status =3D gBS->HandleProtocol ( > - HandleBuffer[Index], > - &gEfiSimpleFileSystemProtocolGuid, > - (VOID **)&Vol > - ); > - if (EFI_ERROR(Status)) { > - continue; > - } > - > - Status =3D ReadFileFromVol (Vol, FileName, &TempBufferSize, &TempBuf= fer); > - if (!EFI_ERROR (Status)) { > - // > - // Read file OK, check duplication > - // > - if (*ThisVol !=3D NULL) { > - // > - // Find the duplicated file > - // > - gBS->FreePool (TempBuffer); > - gBS->FreePool (*Buffer); > - Print (L"Duplicated FileName found!\n"); > - return EFI_NO_MAPPING; > - } else { > - // > - // Record value > - // > - *ThisVol =3D Vol; > - *BufferSize =3D TempBufferSize; > - *Buffer =3D TempBuffer; > - } > - } > - } > - > - // > - // Scan Fs done > - // > - if (*ThisVol =3D=3D NULL) { > - return EFI_NOT_FOUND; > - } > - > - // > - // Done > - // > - return EFI_SUCCESS; > -} > - > -/** > - Read a file. > - > - @param[in] FileName The file to be read. > - @param[out] BufferSize The file buffer size > - @param[out] Buffer The file buffer > - > - @retval EFI_SUCCESS Read file successfully > - @retval EFI_NOT_FOUND File not found > -**/ > -EFI_STATUS > -ReadFileToBuffer ( > - IN CHAR16 *FileName, > - OUT UINTN *BufferSize, > - OUT VOID **Buffer > - ) > -{ > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol; > - Vol =3D NULL; > - return ReadFileToBufferEx(&Vol, FileName, BufferSize, Buffer, FALSE); > -} > - > -/** > Write a file. >=20 > @param[in] FileName The file to be written. > @@ -363,6 +167,8 @@ ReadFileToBuffer ( > @param[in] Buffer The file buffer >=20 > @retval EFI_SUCCESS Write file successfully > + @retval EFI_NOT_FOUND Shell protocol not found > + @retval others Write file failed > **/ > EFI_STATUS > WriteFileFromBuffer ( > @@ -372,79 +178,69 @@ WriteFileFromBuffer ( > ) > { > EFI_STATUS Status; > - EFI_FILE_HANDLE RootDir; > - EFI_FILE_HANDLE Handle; > + EFI_SHELL_PROTOCOL *ShellProtocol; > + SHELL_FILE_HANDLE Handle; > + EFI_FILE_INFO *FileInfo; > UINTN TempBufferSize; > - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol; >=20 > - Vol =3D GetMyVol(); > - if (Vol =3D=3D NULL) { > + ShellProtocol =3D GetShellProtocol(); > + if (ShellProtocol =3D=3D NULL) { > return EFI_NOT_FOUND; > } >=20 > // > - // Open the root directory > + // Open file by FileName. > // > - Status =3D Vol->OpenVolume (Vol, &RootDir); > + Status =3D ShellProtocol->OpenFileByName ( > + FileName, > + &Handle, > + EFI_FILE_MODE_READ | > EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE > + ); > if (EFI_ERROR (Status)) { > return Status; > } >=20 > // > - // Open the file > + // Empty the file contents. > // > - Status =3D RootDir->Open ( > - RootDir, > - &Handle, > - FileName, > - EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE| > EFI_FILE_MODE_CREATE, > - 0 > - ); > - if (EFI_ERROR (Status)) { > - RootDir->Close (RootDir); > - return Status; > - } > - > - // > - // Delete file > - // > - Status =3D Handle->Delete(Handle); > - if (EFI_ERROR(Status)) { > - return Status; > + FileInfo =3D ShellProtocol->GetFileInfo (Handle); > + if (FileInfo =3D=3D NULL) { > + ShellProtocol->CloseFile (Handle); > + return EFI_DEVICE_ERROR; > } >=20 > // > - // Open the file again > + // If the file size is already 0, then it has been empty. > // > - Status =3D RootDir->Open ( > - RootDir, > - &Handle, > - FileName, > - EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE| > EFI_FILE_MODE_CREATE, > - 0 > - ); > - if (EFI_ERROR (Status)) { > - RootDir->Close (RootDir); > - return Status; > + if (FileInfo->FileSize !=3D 0) { > + // > + // Set the file size to 0. > + // > + FileInfo->FileSize =3D 0; > + Status =3D ShellProtocol->SetFileInfo (Handle, FileInfo); > + if (EFI_ERROR (Status)) { > + FreePool (FileInfo); > + ShellProtocol->CloseFile (Handle); > + return Status; > + } > } > - > - RootDir->Close (RootDir); > + FreePool (FileInfo); >=20 > // > // Write the file data from the buffer > // > TempBufferSize =3D BufferSize; > - Status =3D Handle->Write ( > - Handle, > - &TempBufferSize, > - Buffer > - ); > + Status =3D ShellProtocol->WriteFile ( > + Handle, > + &TempBufferSize, > + Buffer > + ); > if (EFI_ERROR (Status)) { > - Handle->Close (Handle); > + ShellProtocol->CloseFile (Handle); > return Status; > } >=20 > - Handle->Close (Handle); > + ShellProtocol->CloseFile (Handle); >=20 > return EFI_SUCCESS; > } > diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c > b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c > index 6febe846b140..63c83b1474a5 100644 > --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c > +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c > @@ -21,11 +21,7 @@ > #include > #include > #include > -#include > -#include > #include > -#include > -#include > #include > #include > #include > @@ -117,7 +113,8 @@ DumpEsrtData ( > @param[out] Buffer The file buffer >=20 > @retval EFI_SUCCESS Read file successfully > - @retval EFI_NOT_FOUND File not found > + @retval EFI_NOT_FOUND Shell protocol or file not found > + @retval others Read file failed > **/ > EFI_STATUS > ReadFileToBuffer ( > @@ -134,6 +131,8 @@ ReadFileToBuffer ( > @param[in] Buffer The file buffer >=20 > @retval EFI_SUCCESS Write file successfully > + @retval EFI_NOT_FOUND Shell protocol not found > + @retval others Write file failed > **/ > EFI_STATUS > WriteFileFromBuffer ( > diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf > b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf > index c255096aaeb7..b06c4ea1bc88 100644 > --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf > +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf > @@ -4,7 +4,7 @@ > # This application can trigger capsule update process. It can also > # generate capsule image, or dump capsule variable information. > # > -# Copyright (c) 2016, Intel Corporation. All rights reserved.
> +# Copyright (c) 2016 - 2017, 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 ma= y be > found at > @@ -40,8 +40,6 @@ [Packages] > MdeModulePkg/MdeModulePkg.dec >=20 > [Guids] > - gEfiFileInfoGuid ## CONSUMES ## GUID > - gEfiPartTypeSystemPartGuid ## CONSUMES ## GUID > gEfiGlobalVariableGuid ## CONSUMES ## GUID > gEfiCapsuleReportGuid ## CONSUMES ## GUID > gEfiFmpCapsuleGuid ## CONSUMES ## GUID > @@ -51,11 +49,10 @@ [Guids] > gEfiSystemResourceTableGuid ## CONSUMES ## GUID >=20 > [Protocols] > - gEfiLoadedImageProtocolGuid ## CONSUMES > - gEfiSimpleFileSystemProtocolGuid ## CONSUMES > gEfiGraphicsOutputProtocolGuid ## CONSUMES > gEfiFirmwareManagementProtocolGuid ## CONSUMES > gEfiShellParametersProtocolGuid ## CONSUMES > + gEfiShellProtocolGuid ## CONSUMES >=20 > [LibraryClasses] > BaseLib > -- > 2.7.0.windows.1