]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c
Add "Debug1" profile (all but Edit and HexEdit commands)
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / EfiDecompress.c
1 /** @file
2 Main file for EfiDecompress shell Debug1 function.
3
4 Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "UefiShellDebug1CommandsLib.h"
16 #include <Protocol/Decompress.h>
17
18
19 SHELL_STATUS
20 EFIAPI
21 ShellCommandRunEfiDecompress (
22 IN EFI_HANDLE ImageHandle,
23 IN EFI_SYSTEM_TABLE *SystemTable
24 )
25 {
26 EFI_STATUS Status;
27 LIST_ENTRY *Package;
28 CHAR16 *ProblemParam;
29 SHELL_STATUS ShellStatus;
30 SHELL_FILE_HANDLE InFileHandle;
31 SHELL_FILE_HANDLE OutFileHandle;
32 UINT32 OutSize;
33 UINTN OutSizeTemp;
34 VOID *OutBuffer;
35 UINTN InSize;
36 VOID *InBuffer;
37 CHAR16 *InFileName;
38 CONST CHAR16 *OutFileName;
39 UINT64 temp;
40 UINT32 ScratchSize;
41 VOID *ScratchBuffer;
42 EFI_DECOMPRESS_PROTOCOL *Decompress;
43
44 InFileName = NULL;
45 OutFileName = NULL;
46 OutSize = 0;
47 ShellStatus = SHELL_SUCCESS;
48 Status = EFI_SUCCESS;
49 OutBuffer = NULL;
50 InBuffer = NULL;
51 ScratchBuffer = NULL;
52 InFileHandle = NULL;
53 OutFileHandle = NULL;
54
55 //
56 // initialize the shell lib (we must be in non-auto-init...)
57 //
58 Status = ShellInitialize();
59 ASSERT_EFI_ERROR(Status);
60
61 Status = CommandInit();
62 ASSERT_EFI_ERROR(Status);
63
64 //
65 // parse the command line
66 //
67 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
68 if (EFI_ERROR(Status)) {
69 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
70 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
71 FreePool(ProblemParam);
72 ShellStatus = SHELL_INVALID_PARAMETER;
73 } else {
74 ASSERT(FALSE);
75 }
76 } else {
77 if (ShellCommandLineGetCount(Package) > 3) {
78 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
79 ShellStatus = SHELL_INVALID_PARAMETER;
80 } else if (ShellCommandLineGetCount(Package) < 3) {
81 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
82 ShellStatus = SHELL_INVALID_PARAMETER;
83 } else {
84 InFileName = ShellFindFilePath(ShellCommandLineGetRawValue(Package, 1));
85 OutFileName = ShellCommandLineGetRawValue(Package, 2);
86 Status = ShellOpenFileByName(InFileName, &InFileHandle, EFI_FILE_MODE_READ, 0);
87 if (EFI_ERROR(Status)) {
88 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue(Package, 1), Status);
89 ShellStatus = SHELL_NOT_FOUND;
90 }
91 Status = ShellOpenFileByName(OutFileName, &OutFileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0);
92 if (EFI_ERROR(Status)) {
93 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue(Package, 2), Status);
94 ShellStatus = SHELL_NOT_FOUND;
95 }
96 if (FileHandleIsDirectory(InFileHandle) == EFI_SUCCESS){
97 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, InFileName);
98 ShellStatus = SHELL_INVALID_PARAMETER;
99 }
100 if (FileHandleIsDirectory(OutFileHandle) == EFI_SUCCESS){
101 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, OutFileName);
102 ShellStatus = SHELL_INVALID_PARAMETER;
103 }
104 Status = FileHandleGetSize(InFileHandle, &temp);
105 ASSERT(temp <= (UINT32)(-1));
106 InSize = (UINTN)temp;
107 ASSERT_EFI_ERROR(Status);
108 InBuffer = AllocatePool(InSize);
109 ASSERT(InBuffer != NULL);
110 Status = gEfiShellProtocol->ReadFile(InFileHandle, &InSize, InBuffer);
111 ASSERT_EFI_ERROR(Status);
112
113 Status = gBS->LocateProtocol(&gEfiDecompressProtocolGuid, NULL, (VOID**)&Decompress);
114 ASSERT_EFI_ERROR(Status);
115
116 Status = Decompress->GetInfo(Decompress, InBuffer, (UINT32)InSize, &OutSize, &ScratchSize);
117 ASSERT_EFI_ERROR(Status);
118
119 OutBuffer = AllocatePool(OutSize);
120 ScratchBuffer = AllocatePool(ScratchSize);
121 ASSERT(OutBuffer != NULL);
122 ASSERT(ScratchBuffer != NULL);
123
124 Status = Decompress->Decompress(Decompress, InBuffer, (UINT32)InSize, OutBuffer, OutSize, ScratchBuffer, ScratchSize);
125 ASSERT_EFI_ERROR(Status);
126
127 if (EFI_ERROR(Status)) {
128 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_EFI_DECOMPRESS_FAIL), gShellDebug1HiiHandle, Status);
129 ShellStatus = SHELL_DEVICE_ERROR;
130 } else {
131 OutSizeTemp = OutSize;
132 Status = gEfiShellProtocol->WriteFile(OutFileHandle, &OutSizeTemp, OutBuffer);
133 OutSize = (UINT32)OutSizeTemp;
134 if (EFI_ERROR(Status)) {
135 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, OutFileName, Status);
136 ShellStatus = SHELL_DEVICE_ERROR;
137 }
138 }
139 }
140
141 ShellCommandLineFreeVarList (Package);
142 }
143 if (InFileName != NULL) {
144 FreePool(InFileName);
145 }
146 if (InFileHandle != NULL) {
147 gEfiShellProtocol->CloseFile(InFileHandle);
148 }
149 if (OutFileHandle != NULL) {
150 gEfiShellProtocol->CloseFile(OutFileHandle);
151 }
152 if (InBuffer != NULL) {
153 FreePool(InBuffer);
154 }
155 if (OutBuffer != NULL) {
156 FreePool(OutBuffer);
157 }
158 if (ScratchBuffer != NULL) {
159 FreePool(ScratchBuffer);
160 }
161
162 return (ShellStatus);
163 }