From: "Yao, Jiewen" <jiewen.yao@intel.com>
To: "Zeng, Star" <star.zeng@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Tian, Feng" <feng.tian@intel.com>
Subject: Re: [PATCH] MdeModulePkg CapsuleApp: Add directory support
Date: Fri, 14 Apr 2017 02:36:00 +0000 [thread overview]
Message-ID: <74D8A39837DF1E4DA445A8C0B3885C503A92C36A@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <1492061398-30996-1-git-send-email-star.zeng@intel.com>
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 <star.zeng@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>; Tian,
> Feng <feng.tian@intel.com>
> Subject: [PATCH] MdeModulePkg CapsuleApp: Add directory support
>
> 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 <jiewen.yao@intel.com>
> Cc: Feng Tian <feng.tian@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Star Zeng <star.zeng@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/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 <Library/BaseMemoryLib.h>
> #include <Library/MemoryAllocationLib.h>
> #include <Library/UefiBootServicesTableLib.h>
> -#include <Library/UefiRuntimeServicesTableLib.h>
> -#include <Library/UefiLib.h>
> -#include <Library/PrintLib.h>
> -#include <Protocol/LoadedImage.h>
> #include <Protocol/SimpleFileSystem.h>
> #include <Protocol/ShellParameters.h>
> +#include <Protocol/Shell.h>
> #include <Guid/FileInfo.h>
> -#include <Guid/Gpt.h>
> -
> -#define IS_HYPHEN(a) ((a) == L'-')
> -#define IS_NULL(a) ((a) == L'\0')
> -
> -#define MAX_ARG_NUM 11
>
> UINTN Argc;
> CHAR16 **Argv;
> +EFI_SHELL_PROTOCOL *mShellProtocol = NULL;
>
> /**
>
> @@ -64,141 +56,103 @@ GetArg (
> }
>
> /**
> - Return File System Volume containing this shell application.
> + Get shell protocol.
>
> - @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 = gBS->HandleProtocol (
> - gImageHandle,
> - &gEfiLoadedImageProtocolGuid,
> - (VOID **)&LoadedImage
> - );
> - ASSERT_EFI_ERROR (Status);
> + EFI_STATUS Status;
>
> - Status = gBS->HandleProtocol (
> - LoadedImage->DeviceHandle,
> - &gEfiSimpleFileSystemProtocolGuid,
> - (VOID **)&Vol
> - );
> - if (!EFI_ERROR (Status)) {
> - return Vol;
> + if (mShellProtocol == NULL) {
> + Status = gBS->LocateProtocol (
> + &gEfiShellProtocolGuid,
> + NULL,
> + (VOID **) &mShellProtocol
> + );
> + if (EFI_ERROR (Status)) {
> + mShellProtocol = NULL;
> + }
> }
>
> - return NULL;
> + return mShellProtocol;
> }
>
> /**
> - Read a file from this volume.
> + Read a file.
>
> - @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
>
> @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;
>
> - //
> - // Open the root directory
> - //
> - Status = Vol->OpenVolume (Vol, &RootDir);
> - if (EFI_ERROR (Status)) {
> - return Status;
> + ShellProtocol = GetShellProtocol();
> + if (ShellProtocol == NULL) {
> + return EFI_NOT_FOUND;
> }
>
> //
> - // Open the file
> + // Open file by FileName.
> //
> - Status = RootDir->Open (
> - RootDir,
> - &Handle,
> - FileName,
> - EFI_FILE_MODE_READ,
> - 0
> - );
> + Status = ShellProtocol->OpenFileByName (
> + FileName,
> + &Handle,
> + EFI_FILE_MODE_READ
> + );
> if (EFI_ERROR (Status)) {
> - RootDir->Close (RootDir);
> return Status;
> }
>
> - RootDir->Close (RootDir);
> -
> //
> - // Get the file information
> + // Get the file size.
> //
> - FileInfoSize = sizeof(EFI_FILE_INFO) + 1024;
> -
> - FileInfo = AllocateZeroPool (FileInfoSize);
> - if (FileInfo == NULL) {
> - Handle->Close (Handle);
> + Status = ShellProtocol->GetFileSize (Handle, &FileSize);
> + if (EFI_ERROR (Status)) {
> + ShellProtocol->CloseFile (Handle);
> return Status;
> }
>
> - Status = 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 = (UINTN) FileInfo->FileSize + sizeof(CHAR16);
> + TempBufferSize = (UINTN) FileSize;
> TempBuffer = AllocateZeroPool (TempBufferSize);
> if (TempBuffer == NULL) {
> - Handle->Close (Handle);
> - gBS->FreePool (FileInfo);
> - return Status;
> + ShellProtocol->CloseFile (Handle);
> + return EFI_OUT_OF_RESOURCES;
> }
>
> - gBS->FreePool (FileInfo);
> -
> //
> // Read the file data to the buffer
> //
> - Status = Handle->Read (
> - Handle,
> - &TempBufferSize,
> - TempBuffer
> - );
> + Status = ShellProtocol->ReadFile (
> + Handle,
> + &TempBufferSize,
> + TempBuffer
> + );
> if (EFI_ERROR (Status)) {
> - Handle->Close (Handle);
> - gBS->FreePool (TempBuffer);
> + ShellProtocol->CloseFile (Handle);
> return Status;
> }
>
> - Handle->Close (Handle);
> + ShellProtocol->CloseFile (Handle);
>
> *BufferSize = TempBufferSize;
> *Buffer = TempBuffer;
> @@ -206,156 +160,6 @@ ReadFileFromVol (
> }
>
> /**
> - 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 == NULL) || (Buffer == NULL) || (ThisVol == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - //
> - // not scan fs
> - //
> - if (!ScanFs) {
> - if (*ThisVol == NULL) {
> - *ThisVol = GetMyVol ();
> - if (*ThisVol == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> - }
> - //
> - // Read file directly from Vol
> - //
> - return ReadFileFromVol (*ThisVol, FileName, BufferSize, Buffer);
> - }
> -
> - //
> - // need scan fs
> - //
> -
> - //
> - // Get all Vol handle
> - //
> - Status = gBS->LocateHandleBuffer (
> - ByProtocol,
> - &gEfiSimpleFileSystemProtocolGuid,
> - NULL,
> - &NoHandles,
> - &HandleBuffer
> - );
> - if (EFI_ERROR (Status) && (NoHandles == 0)) {
> - return EFI_NOT_FOUND;
> - }
> -
> - //
> - // Walk through each Vol
> - //
> - *ThisVol = NULL;
> - *BufferSize = 0;
> - *Buffer = NULL;
> - for (Index = 0; Index < NoHandles; Index++) {
> - Status = gBS->HandleProtocol (
> - HandleBuffer[Index],
> - &gEfiSimpleFileSystemProtocolGuid,
> - (VOID **)&Vol
> - );
> - if (EFI_ERROR(Status)) {
> - continue;
> - }
> -
> - Status = ReadFileFromVol (Vol, FileName, &TempBufferSize, &TempBuffer);
> - if (!EFI_ERROR (Status)) {
> - //
> - // Read file OK, check duplication
> - //
> - if (*ThisVol != 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 = Vol;
> - *BufferSize = TempBufferSize;
> - *Buffer = TempBuffer;
> - }
> - }
> - }
> -
> - //
> - // Scan Fs done
> - //
> - if (*ThisVol == 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 = NULL;
> - return ReadFileToBufferEx(&Vol, FileName, BufferSize, Buffer, FALSE);
> -}
> -
> -/**
> Write a file.
>
> @param[in] FileName The file to be written.
> @@ -363,6 +167,8 @@ ReadFileToBuffer (
> @param[in] Buffer The file buffer
>
> @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;
>
> - Vol = GetMyVol();
> - if (Vol == NULL) {
> + ShellProtocol = GetShellProtocol();
> + if (ShellProtocol == NULL) {
> return EFI_NOT_FOUND;
> }
>
> //
> - // Open the root directory
> + // Open file by FileName.
> //
> - Status = Vol->OpenVolume (Vol, &RootDir);
> + Status = ShellProtocol->OpenFileByName (
> + FileName,
> + &Handle,
> + EFI_FILE_MODE_READ |
> EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE
> + );
> if (EFI_ERROR (Status)) {
> return Status;
> }
>
> //
> - // Open the file
> + // Empty the file contents.
> //
> - Status = 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 = Handle->Delete(Handle);
> - if (EFI_ERROR(Status)) {
> - return Status;
> + FileInfo = ShellProtocol->GetFileInfo (Handle);
> + if (FileInfo == NULL) {
> + ShellProtocol->CloseFile (Handle);
> + return EFI_DEVICE_ERROR;
> }
>
> //
> - // Open the file again
> + // If the file size is already 0, then it has been empty.
> //
> - Status = 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 != 0) {
> + //
> + // Set the file size to 0.
> + //
> + FileInfo->FileSize = 0;
> + Status = ShellProtocol->SetFileInfo (Handle, FileInfo);
> + if (EFI_ERROR (Status)) {
> + FreePool (FileInfo);
> + ShellProtocol->CloseFile (Handle);
> + return Status;
> + }
> }
> -
> - RootDir->Close (RootDir);
> + FreePool (FileInfo);
>
> //
> // Write the file data from the buffer
> //
> TempBufferSize = BufferSize;
> - Status = Handle->Write (
> - Handle,
> - &TempBufferSize,
> - Buffer
> - );
> + Status = ShellProtocol->WriteFile (
> + Handle,
> + &TempBufferSize,
> + Buffer
> + );
> if (EFI_ERROR (Status)) {
> - Handle->Close (Handle);
> + ShellProtocol->CloseFile (Handle);
> return Status;
> }
>
> - Handle->Close (Handle);
> + ShellProtocol->CloseFile (Handle);
>
> 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 <Library/UefiRuntimeServicesTableLib.h>
> #include <Library/UefiLib.h>
> #include <Library/PrintLib.h>
> -#include <Protocol/LoadedImage.h>
> -#include <Protocol/SimpleFileSystem.h>
> #include <Protocol/GraphicsOutput.h>
> -#include <Guid/FileInfo.h>
> -#include <Guid/Gpt.h>
> #include <Guid/GlobalVariable.h>
> #include <Guid/CapsuleReport.h>
> #include <Guid/SystemResourceTable.h>
> @@ -117,7 +113,8 @@ DumpEsrtData (
> @param[out] Buffer The file buffer
>
> @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
>
> @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.<BR>
> +# Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
> # 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
> @@ -40,8 +40,6 @@ [Packages]
> MdeModulePkg/MdeModulePkg.dec
>
> [Guids]
> - gEfiFileInfoGuid ## CONSUMES ## GUID
> - gEfiPartTypeSystemPartGuid ## CONSUMES ## GUID
> gEfiGlobalVariableGuid ## CONSUMES ## GUID
> gEfiCapsuleReportGuid ## CONSUMES ## GUID
> gEfiFmpCapsuleGuid ## CONSUMES ## GUID
> @@ -51,11 +49,10 @@ [Guids]
> gEfiSystemResourceTableGuid ## CONSUMES ## GUID
>
> [Protocols]
> - gEfiLoadedImageProtocolGuid ## CONSUMES
> - gEfiSimpleFileSystemProtocolGuid ## CONSUMES
> gEfiGraphicsOutputProtocolGuid ## CONSUMES
> gEfiFirmwareManagementProtocolGuid ## CONSUMES
> gEfiShellParametersProtocolGuid ## CONSUMES
> + gEfiShellProtocolGuid ## CONSUMES
>
> [LibraryClasses]
> BaseLib
> --
> 2.7.0.windows.1
prev parent reply other threads:[~2017-04-14 2:36 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-13 5:29 [PATCH] MdeModulePkg CapsuleApp: Add directory support Star Zeng
2017-04-14 2:36 ` Yao, Jiewen [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=74D8A39837DF1E4DA445A8C0B3885C503A92C36A@shsmsx102.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox