From nobody Sun Apr 28 23:06:45 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Authentication-Results: mx.zoho.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 149206140783958.72353727338452; Wed, 12 Apr 2017 22:30:07 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id ED24E2194EB55; Wed, 12 Apr 2017 22:30:05 -0700 (PDT) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 A59F821A0483A for ; Wed, 12 Apr 2017 22:30:03 -0700 (PDT) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Apr 2017 22:30:03 -0700 Received: from shwdeopenpsi068.ccr.corp.intel.com ([10.239.9.20]) by fmsmga006.fm.intel.com with ESMTP; 12 Apr 2017 22:30:01 -0700 X-Original-To: edk2-devel@lists.01.org X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.37,193,1488873600"; d="scan'208";a="88541944" From: Star Zeng To: edk2-devel@lists.01.org Date: Thu, 13 Apr 2017 13:29:58 +0800 Message-Id: <1492061398-30996-1-git-send-email-star.zeng@intel.com> X-Mailer: git-send-email 2.7.0.windows.1 Subject: [edk2] [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: , Cc: Feng Tian , Jiewen Yao , Star Zeng MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" 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. "CapsuleApp: capsule image (Capsule image file name) is not found." This patch is to add directory support for CapsuleApp by using shell protocol. Cc: Jiewen Yao Cc: Feng Tian Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng Reviewed-by: jiewen.yao@intel.com --- 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(-) diff --git a/MdeModulePkg/Application/CapsuleApp/AppSupport.c b/MdeModulePk= g/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 NU= LL)) { - 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, &TempBuffe= r); - 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_M= ODE_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_M= ODE_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/MdeModulePk= g/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/MdeModule= Pkg/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 B= SD License # which accompanies this distribution. The full text of the license may = 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 --=20 2.7.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel