diff options
Diffstat (limited to 'MdeModulePkg/Application/CapsuleApp/AppSupport.c')
| -rw-r--r-- | MdeModulePkg/Application/CapsuleApp/AppSupport.c | 464 |
1 files changed, 232 insertions, 232 deletions
diff --git a/MdeModulePkg/Application/CapsuleApp/AppSupport.c b/MdeModulePkg/Application/CapsuleApp/AppSupport.c index 3b98ad07bf..d75c532352 100644 --- a/MdeModulePkg/Application/CapsuleApp/AppSupport.c +++ b/MdeModulePkg/Application/CapsuleApp/AppSupport.c @@ -1,232 +1,232 @@ -/** @file
- A shell application that triggers capsule update process.
-
- Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "CapsuleApp.h"
-
-UINTN Argc;
-CHAR16 **Argv;
-EFI_SHELL_PROTOCOL *mShellProtocol = NULL;
-
-/**
-
- This function parse application ARG.
-
- @return Status
-**/
-EFI_STATUS
-GetArg (
- VOID
- )
-{
- EFI_STATUS Status;
- EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
-
- Status = gBS->HandleProtocol (
- gImageHandle,
- &gEfiShellParametersProtocolGuid,
- (VOID **)&ShellParameters
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Argc = ShellParameters->Argc;
- Argv = ShellParameters->Argv;
- return EFI_SUCCESS;
-}
-
-/**
- Get shell protocol.
-
- @return Pointer to shell protocol.
-**/
-EFI_SHELL_PROTOCOL *
-GetShellProtocol (
- VOID
- )
-{
- EFI_STATUS Status;
-
- if (mShellProtocol == NULL) {
- Status = gBS->LocateProtocol (
- &gEfiShellProtocolGuid,
- NULL,
- (VOID **)&mShellProtocol
- );
- if (EFI_ERROR (Status)) {
- mShellProtocol = NULL;
- }
- }
-
- return mShellProtocol;
-}
-
-/**
- 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 Shell protocol or file not found
- @retval others Read file failed
-**/
-EFI_STATUS
-ReadFileToBuffer (
- IN CHAR16 *FileName,
- OUT UINTN *BufferSize,
- OUT VOID **Buffer
- )
-{
- EFI_STATUS Status;
- EFI_SHELL_PROTOCOL *ShellProtocol;
- SHELL_FILE_HANDLE Handle;
- UINT64 FileSize;
- UINTN TempBufferSize;
- VOID *TempBuffer;
-
- ShellProtocol = GetShellProtocol ();
- if (ShellProtocol == NULL) {
- return EFI_NOT_FOUND;
- }
-
- //
- // Open file by FileName.
- //
- Status = ShellProtocol->OpenFileByName (
- FileName,
- &Handle,
- EFI_FILE_MODE_READ
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Get the file size.
- //
- Status = ShellProtocol->GetFileSize (Handle, &FileSize);
- if (EFI_ERROR (Status)) {
- ShellProtocol->CloseFile (Handle);
- return Status;
- }
-
- TempBufferSize = (UINTN)FileSize;
- TempBuffer = AllocateZeroPool (TempBufferSize);
- if (TempBuffer == NULL) {
- ShellProtocol->CloseFile (Handle);
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Read the file data to the buffer
- //
- Status = ShellProtocol->ReadFile (
- Handle,
- &TempBufferSize,
- TempBuffer
- );
- if (EFI_ERROR (Status)) {
- ShellProtocol->CloseFile (Handle);
- return Status;
- }
-
- ShellProtocol->CloseFile (Handle);
-
- *BufferSize = TempBufferSize;
- *Buffer = TempBuffer;
- return EFI_SUCCESS;
-}
-
-/**
- Write a file.
-
- @param[in] FileName The file to be written.
- @param[in] BufferSize The file buffer size
- @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 (
- IN CHAR16 *FileName,
- IN UINTN BufferSize,
- IN VOID *Buffer
- )
-{
- EFI_STATUS Status;
- EFI_SHELL_PROTOCOL *ShellProtocol;
- SHELL_FILE_HANDLE Handle;
- EFI_FILE_INFO *FileInfo;
- UINTN TempBufferSize;
-
- ShellProtocol = GetShellProtocol ();
- if (ShellProtocol == NULL) {
- return EFI_NOT_FOUND;
- }
-
- //
- // Open file by FileName.
- //
- Status = ShellProtocol->OpenFileByName (
- FileName,
- &Handle,
- EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Empty the file contents.
- //
- FileInfo = ShellProtocol->GetFileInfo (Handle);
- if (FileInfo == NULL) {
- ShellProtocol->CloseFile (Handle);
- return EFI_DEVICE_ERROR;
- }
-
- //
- // If the file size is already 0, then it has been empty.
- //
- 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;
- }
- }
-
- FreePool (FileInfo);
-
- //
- // Write the file data from the buffer
- //
- TempBufferSize = BufferSize;
- Status = ShellProtocol->WriteFile (
- Handle,
- &TempBufferSize,
- Buffer
- );
- if (EFI_ERROR (Status)) {
- ShellProtocol->CloseFile (Handle);
- return Status;
- }
-
- ShellProtocol->CloseFile (Handle);
-
- return EFI_SUCCESS;
-}
+/** @file + A shell application that triggers capsule update process. + + Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "CapsuleApp.h" + +UINTN Argc; +CHAR16 **Argv; +EFI_SHELL_PROTOCOL *mShellProtocol = NULL; + +/** + + This function parse application ARG. + + @return Status +**/ +EFI_STATUS +GetArg ( + VOID + ) +{ + EFI_STATUS Status; + EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters; + + Status = gBS->HandleProtocol ( + gImageHandle, + &gEfiShellParametersProtocolGuid, + (VOID **)&ShellParameters + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Argc = ShellParameters->Argc; + Argv = ShellParameters->Argv; + return EFI_SUCCESS; +} + +/** + Get shell protocol. + + @return Pointer to shell protocol. +**/ +EFI_SHELL_PROTOCOL * +GetShellProtocol ( + VOID + ) +{ + EFI_STATUS Status; + + if (mShellProtocol == NULL) { + Status = gBS->LocateProtocol ( + &gEfiShellProtocolGuid, + NULL, + (VOID **)&mShellProtocol + ); + if (EFI_ERROR (Status)) { + mShellProtocol = NULL; + } + } + + return mShellProtocol; +} + +/** + 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 Shell protocol or file not found + @retval others Read file failed +**/ +EFI_STATUS +ReadFileToBuffer ( + IN CHAR16 *FileName, + OUT UINTN *BufferSize, + OUT VOID **Buffer + ) +{ + EFI_STATUS Status; + EFI_SHELL_PROTOCOL *ShellProtocol; + SHELL_FILE_HANDLE Handle; + UINT64 FileSize; + UINTN TempBufferSize; + VOID *TempBuffer; + + ShellProtocol = GetShellProtocol (); + if (ShellProtocol == NULL) { + return EFI_NOT_FOUND; + } + + // + // Open file by FileName. + // + Status = ShellProtocol->OpenFileByName ( + FileName, + &Handle, + EFI_FILE_MODE_READ + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get the file size. + // + Status = ShellProtocol->GetFileSize (Handle, &FileSize); + if (EFI_ERROR (Status)) { + ShellProtocol->CloseFile (Handle); + return Status; + } + + TempBufferSize = (UINTN)FileSize; + TempBuffer = AllocateZeroPool (TempBufferSize); + if (TempBuffer == NULL) { + ShellProtocol->CloseFile (Handle); + return EFI_OUT_OF_RESOURCES; + } + + // + // Read the file data to the buffer + // + Status = ShellProtocol->ReadFile ( + Handle, + &TempBufferSize, + TempBuffer + ); + if (EFI_ERROR (Status)) { + ShellProtocol->CloseFile (Handle); + return Status; + } + + ShellProtocol->CloseFile (Handle); + + *BufferSize = TempBufferSize; + *Buffer = TempBuffer; + return EFI_SUCCESS; +} + +/** + Write a file. + + @param[in] FileName The file to be written. + @param[in] BufferSize The file buffer size + @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 ( + IN CHAR16 *FileName, + IN UINTN BufferSize, + IN VOID *Buffer + ) +{ + EFI_STATUS Status; + EFI_SHELL_PROTOCOL *ShellProtocol; + SHELL_FILE_HANDLE Handle; + EFI_FILE_INFO *FileInfo; + UINTN TempBufferSize; + + ShellProtocol = GetShellProtocol (); + if (ShellProtocol == NULL) { + return EFI_NOT_FOUND; + } + + // + // Open file by FileName. + // + Status = ShellProtocol->OpenFileByName ( + FileName, + &Handle, + EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Empty the file contents. + // + FileInfo = ShellProtocol->GetFileInfo (Handle); + if (FileInfo == NULL) { + ShellProtocol->CloseFile (Handle); + return EFI_DEVICE_ERROR; + } + + // + // If the file size is already 0, then it has been empty. + // + 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; + } + } + + FreePool (FileInfo); + + // + // Write the file data from the buffer + // + TempBufferSize = BufferSize; + Status = ShellProtocol->WriteFile ( + Handle, + &TempBufferSize, + Buffer + ); + if (EFI_ERROR (Status)) { + ShellProtocol->CloseFile (Handle); + return Status; + } + + ShellProtocol->CloseFile (Handle); + + return EFI_SUCCESS; +} |
