2 Main file for EfiDecompress shell Debug1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include "UefiShellDebug1CommandsLib.h"
11 #include <Protocol/Decompress.h>
14 Function for 'decompress' command.
16 @param[in] ImageHandle Handle to the Image (NULL if Internal).
17 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
21 ShellCommandRunEfiDecompress (
22 IN EFI_HANDLE ImageHandle
,
23 IN EFI_SYSTEM_TABLE
*SystemTable
29 SHELL_STATUS ShellStatus
;
30 SHELL_FILE_HANDLE InFileHandle
;
31 SHELL_FILE_HANDLE OutFileHandle
;
38 CONST CHAR16
*OutFileName
;
42 EFI_DECOMPRESS_PROTOCOL
*Decompress
;
43 CONST CHAR16
*TempParam
;
49 ShellStatus
= SHELL_SUCCESS
;
59 // initialize the shell lib (we must be in non-auto-init...)
61 Status
= ShellInitialize ();
62 ASSERT_EFI_ERROR (Status
);
64 Status
= CommandInit ();
65 ASSERT_EFI_ERROR (Status
);
68 // parse the command line
70 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
71 if (EFI_ERROR (Status
)) {
72 if ((Status
== EFI_VOLUME_CORRUPTED
) && (ProblemParam
!= NULL
)) {
73 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, L
"efidecompress", ProblemParam
);
74 FreePool (ProblemParam
);
75 ShellStatus
= SHELL_INVALID_PARAMETER
;
80 if (ShellCommandLineGetCount (Package
) > 3) {
81 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
, L
"efidecompress");
82 ShellStatus
= SHELL_INVALID_PARAMETER
;
83 } else if (ShellCommandLineGetCount (Package
) < 3) {
84 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
, L
"efidecompress");
85 ShellStatus
= SHELL_INVALID_PARAMETER
;
87 TempParam
= ShellCommandLineGetRawValue (Package
, 1);
88 ASSERT (TempParam
!= NULL
);
89 InFileName
= ShellFindFilePath (TempParam
);
90 OutFileName
= ShellCommandLineGetRawValue (Package
, 2);
91 if (InFileName
== NULL
) {
92 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, L
"efidecompress", TempParam
);
93 ShellStatus
= SHELL_NOT_FOUND
;
95 if (ShellIsDirectory (InFileName
) == EFI_SUCCESS
) {
96 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, L
"efidecompress", InFileName
);
97 ShellStatus
= SHELL_INVALID_PARAMETER
;
100 if (ShellIsDirectory (OutFileName
) == EFI_SUCCESS
) {
101 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, L
"efidecompress", OutFileName
);
102 ShellStatus
= SHELL_INVALID_PARAMETER
;
105 if (ShellStatus
== SHELL_SUCCESS
) {
106 Status
= ShellOpenFileByName (InFileName
, &InFileHandle
, EFI_FILE_MODE_READ
, 0);
107 if (EFI_ERROR (Status
)) {
108 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, L
"efidecompress", ShellCommandLineGetRawValue (Package
, 1));
109 ShellStatus
= SHELL_NOT_FOUND
;
113 if (ShellStatus
== SHELL_SUCCESS
) {
114 Status
= FileHandleGetSize (InFileHandle
, &Temp64Bit
);
115 ASSERT (Temp64Bit
<= (UINT32
)(-1));
116 InSize
= (UINTN
)Temp64Bit
;
117 ASSERT_EFI_ERROR (Status
);
118 InBuffer
= AllocateZeroPool (InSize
);
119 if (InBuffer
== NULL
) {
120 Status
= EFI_OUT_OF_RESOURCES
;
122 Status
= gEfiShellProtocol
->ReadFile (InFileHandle
, &InSize
, InBuffer
);
123 ASSERT_EFI_ERROR (Status
);
125 Status
= gBS
->LocateProtocol (&gEfiDecompressProtocolGuid
, NULL
, (VOID
**)&Decompress
);
126 ASSERT_EFI_ERROR (Status
);
128 Status
= Decompress
->GetInfo (Decompress
, InBuffer
, (UINT32
)InSize
, &OutSize
, &ScratchSize
);
131 if (EFI_ERROR (Status
) || (OutSize
== 0)) {
132 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_EFI_DECOMPRESS_NOPE
), gShellDebug1HiiHandle
, InFileName
);
133 ShellStatus
= SHELL_NOT_FOUND
;
135 Status
= ShellOpenFileByName (OutFileName
, &OutFileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
136 if (EFI_ERROR (Status
)) {
137 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue (Package
, 2), Status
);
138 ShellStatus
= SHELL_NOT_FOUND
;
140 OutBuffer
= AllocateZeroPool (OutSize
);
141 ScratchBuffer
= AllocateZeroPool (ScratchSize
);
142 if ((OutBuffer
== NULL
) || (ScratchBuffer
== NULL
)) {
143 Status
= EFI_OUT_OF_RESOURCES
;
145 Status
= Decompress
->Decompress (Decompress
, InBuffer
, (UINT32
)InSize
, OutBuffer
, OutSize
, ScratchBuffer
, ScratchSize
);
150 if (EFI_ERROR (Status
)) {
151 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_EFI_DECOMPRESS_FAIL
), gShellDebug1HiiHandle
, Status
);
152 ShellStatus
= ((Status
== EFI_OUT_OF_RESOURCES
) ? SHELL_OUT_OF_RESOURCES
: SHELL_DEVICE_ERROR
);
154 OutSizeTemp
= OutSize
;
155 Status
= gEfiShellProtocol
->WriteFile (OutFileHandle
, &OutSizeTemp
, OutBuffer
);
156 OutSize
= (UINT32
)OutSizeTemp
;
157 if (EFI_ERROR (Status
)) {
158 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_FILE_WRITE_FAIL
), gShellDebug1HiiHandle
, L
"efidecompress", OutFileName
, Status
);
159 ShellStatus
= SHELL_DEVICE_ERROR
;
166 ShellCommandLineFreeVarList (Package
);
169 if (InFileHandle
!= NULL
) {
170 gEfiShellProtocol
->CloseFile (InFileHandle
);
173 if (OutFileHandle
!= NULL
) {
174 gEfiShellProtocol
->CloseFile (OutFileHandle
);
177 SHELL_FREE_NON_NULL (InFileName
);
178 SHELL_FREE_NON_NULL (InBuffer
);
179 SHELL_FREE_NON_NULL (OutBuffer
);
180 SHELL_FREE_NON_NULL (ScratchBuffer
);
182 return (ShellStatus
);