]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c
ShellPkg: add the last PCIe extended capability decodings
[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 /**
20 Function for 'decompress' command.
21
22 @param[in] ImageHandle Handle to the Image (NULL if Internal).
23 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
24 **/
25 SHELL_STATUS
26 EFIAPI
27 ShellCommandRunEfiDecompress (
28 IN EFI_HANDLE ImageHandle,
29 IN EFI_SYSTEM_TABLE *SystemTable
30 )
31 {
32 EFI_STATUS Status;
33 LIST_ENTRY *Package;
34 CHAR16 *ProblemParam;
35 SHELL_STATUS ShellStatus;
36 SHELL_FILE_HANDLE InFileHandle;
37 SHELL_FILE_HANDLE OutFileHandle;
38 UINT32 OutSize;
39 UINTN OutSizeTemp;
40 VOID *OutBuffer;
41 UINTN InSize;
42 VOID *InBuffer;
43 CHAR16 *InFileName;
44 CONST CHAR16 *OutFileName;
45 UINT64 Temp64Bit;
46 UINT32 ScratchSize;
47 VOID *ScratchBuffer;
48 EFI_DECOMPRESS_PROTOCOL *Decompress;
49 CONST CHAR16 *TempParam;
50
51 InFileName = NULL;
52 OutFileName = NULL;
53 OutSize = 0;
54 ShellStatus = SHELL_SUCCESS;
55 Status = EFI_SUCCESS;
56 OutBuffer = NULL;
57 InBuffer = NULL;
58 ScratchBuffer = NULL;
59 InFileHandle = NULL;
60 OutFileHandle = NULL;
61
62 //
63 // initialize the shell lib (we must be in non-auto-init...)
64 //
65 Status = ShellInitialize();
66 ASSERT_EFI_ERROR(Status);
67
68 Status = CommandInit();
69 ASSERT_EFI_ERROR(Status);
70
71 //
72 // parse the command line
73 //
74 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
75 if (EFI_ERROR(Status)) {
76 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
77 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
78 FreePool(ProblemParam);
79 ShellStatus = SHELL_INVALID_PARAMETER;
80 } else {
81 ASSERT(FALSE);
82 }
83 } else {
84 if (ShellCommandLineGetCount(Package) > 3) {
85 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
86 ShellStatus = SHELL_INVALID_PARAMETER;
87 } else if (ShellCommandLineGetCount(Package) < 3) {
88 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
89 ShellStatus = SHELL_INVALID_PARAMETER;
90 } else {
91 TempParam = ShellCommandLineGetRawValue(Package, 1);
92 ASSERT(TempParam != NULL);
93 InFileName = ShellFindFilePath(TempParam);
94 OutFileName = ShellCommandLineGetRawValue(Package, 2);
95 if (InFileName == NULL) {
96 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, TempParam);
97 ShellStatus = SHELL_NOT_FOUND;
98 } else {
99 if (ShellIsDirectory(InFileName) == EFI_SUCCESS){
100 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, InFileName);
101 ShellStatus = SHELL_INVALID_PARAMETER;
102 }
103 if (ShellIsDirectory(OutFileName) == EFI_SUCCESS){
104 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, OutFileName);
105 ShellStatus = SHELL_INVALID_PARAMETER;
106 }
107 if (ShellStatus == SHELL_SUCCESS) {
108 Status = ShellOpenFileByName(InFileName, &InFileHandle, EFI_FILE_MODE_READ, 0);
109 if (EFI_ERROR(Status)) {
110 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue(Package, 1), Status);
111 ShellStatus = SHELL_NOT_FOUND;
112 }
113 Status = ShellOpenFileByName(OutFileName, &OutFileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0);
114 if (EFI_ERROR(Status)) {
115 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue(Package, 2), Status);
116 ShellStatus = SHELL_NOT_FOUND;
117 }
118 }
119
120 if (ShellStatus == SHELL_SUCCESS) {
121 Status = FileHandleGetSize(InFileHandle, &Temp64Bit);
122 ASSERT(Temp64Bit <= (UINT32)(-1));
123 InSize = (UINTN)Temp64Bit;
124 ASSERT_EFI_ERROR(Status);
125 InBuffer = AllocateZeroPool(InSize);
126 ASSERT(InBuffer != NULL);
127 Status = gEfiShellProtocol->ReadFile(InFileHandle, &InSize, InBuffer);
128 ASSERT_EFI_ERROR(Status);
129
130 Status = gBS->LocateProtocol(&gEfiDecompressProtocolGuid, NULL, (VOID**)&Decompress);
131 ASSERT_EFI_ERROR(Status);
132
133 Status = Decompress->GetInfo(Decompress, InBuffer, (UINT32)InSize, &OutSize, &ScratchSize);
134 ASSERT_EFI_ERROR(Status);
135
136 OutBuffer = AllocateZeroPool(OutSize);
137 ScratchBuffer = AllocateZeroPool(ScratchSize);
138 ASSERT(OutBuffer != NULL);
139 ASSERT(ScratchBuffer != NULL);
140
141 Status = Decompress->Decompress(Decompress, InBuffer, (UINT32)InSize, OutBuffer, OutSize, ScratchBuffer, ScratchSize);
142 ASSERT_EFI_ERROR(Status);
143
144 if (EFI_ERROR(Status)) {
145 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_EFI_DECOMPRESS_FAIL), gShellDebug1HiiHandle, Status);
146 ShellStatus = SHELL_DEVICE_ERROR;
147 } else {
148 OutSizeTemp = OutSize;
149 Status = gEfiShellProtocol->WriteFile(OutFileHandle, &OutSizeTemp, OutBuffer);
150 OutSize = (UINT32)OutSizeTemp;
151 if (EFI_ERROR(Status)) {
152 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, OutFileName, Status);
153 ShellStatus = SHELL_DEVICE_ERROR;
154 }
155 }
156 }
157 }
158 }
159
160 ShellCommandLineFreeVarList (Package);
161 }
162 if (InFileHandle != NULL) {
163 gEfiShellProtocol->CloseFile(InFileHandle);
164 }
165 if (OutFileHandle != NULL) {
166 gEfiShellProtocol->CloseFile(OutFileHandle);
167 }
168
169 SHELL_FREE_NON_NULL(InFileName);
170 SHELL_FREE_NON_NULL(InBuffer);
171 SHELL_FREE_NON_NULL(OutBuffer);
172 SHELL_FREE_NON_NULL(ScratchBuffer);
173
174 return (ShellStatus);
175 }