]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c
EditTitleBar - Remove ASSERT. Complete display output for Disk and Memory output.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / HexEdit / HexEdit.c
1 /** @file
2 Main entry point of editor
3
4 Copyright (c) 2005 - 2011, 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 "HexEditor.h"
17
18 //
19 // Global Variables
20 //
21 STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
22 {L"-f", TypeFlag},
23 {L"-d", TypeFlag},
24 {L"-m", TypeFlag},
25 {NULL, TypeMax}
26 };
27
28 /**
29 Function for 'hexedit' command.
30
31 @param[in] ImageHandle Handle to the Image (NULL if Internal).
32 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
33 **/
34 SHELL_STATUS
35 EFIAPI
36 ShellCommandRunHexEdit (
37 IN EFI_HANDLE ImageHandle,
38 IN EFI_SYSTEM_TABLE *SystemTable
39 )
40 {
41 EFI_STATUS Status;
42 CHAR16 *Buffer;
43 CHAR16 *ProblemParam;
44 SHELL_STATUS ShellStatus;
45 LIST_ENTRY *Package;
46 CONST CHAR16 *Cwd;
47 CHAR16 *NewName;
48 CHAR16 *Spot;
49 CONST CHAR16 *Name;
50 UINTN Offset;
51 UINTN Size;
52 UINT64 LastOffset;
53 EDIT_FILE_TYPE WhatToDo;
54
55 Buffer = NULL;
56 ShellStatus = SHELL_SUCCESS;
57 NewName = NULL;
58 Cwd = NULL;
59 Buffer = NULL;
60 Name = NULL;
61 Spot = NULL;
62 Offset = 0;
63 Size = 0;
64 LastOffset = 0;
65 WhatToDo = FileTypeNone;
66
67 //
68 // initialize the shell lib (we must be in non-auto-init...)
69 //
70 Status = ShellInitialize();
71 ASSERT_EFI_ERROR(Status);
72
73 Status = CommandInit();
74 ASSERT_EFI_ERROR(Status);
75
76 //
77 // parse the command line
78 //
79 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
80 if (EFI_ERROR(Status)) {
81 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
82 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
83 FreePool(ProblemParam);
84 ShellStatus = SHELL_INVALID_PARAMETER;
85 } else {
86 ASSERT(FALSE);
87 }
88 } else {
89 //
90 // Check for -d
91 //
92 if (ShellCommandLineGetFlag(Package, L"-d")){
93 if (ShellCommandLineGetCount(Package) < 4) {
94 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
95 ShellStatus = SHELL_INVALID_PARAMETER;
96 } else if (ShellCommandLineGetCount(Package) > 4) {
97 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
98 ShellStatus = SHELL_INVALID_PARAMETER;
99 } else {
100 WhatToDo = FileTypeDiskBuffer;
101 Name = ShellCommandLineGetRawValue(Package, 1);
102 Offset = ShellStrToUintn(ShellCommandLineGetRawValue(Package, 2));
103 Size = ShellStrToUintn(ShellCommandLineGetRawValue(Package, 3));
104 }
105 if (Offset == (UINTN)-1 || Size == (UINTN)-1) {
106 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"-d");
107 ShellStatus = SHELL_INVALID_PARAMETER;
108 }
109 }
110
111 //
112 // check for -f
113 //
114 if (ShellCommandLineGetFlag(Package, L"-f") && (WhatToDo == FileTypeNone)){
115 if (ShellCommandLineGetCount(Package) < 2) {
116 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
117 ShellStatus = SHELL_INVALID_PARAMETER;
118 } else if (ShellCommandLineGetCount(Package) > 2) {
119 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
120 ShellStatus = SHELL_INVALID_PARAMETER;
121 } else {
122 Name = ShellCommandLineGetRawValue(Package, 1);
123 if (Name == NULL || !IsValidFileName(Name)) {
124 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Name);
125 ShellStatus = SHELL_INVALID_PARAMETER;
126 } else {
127 WhatToDo = FileTypeFileBuffer;
128 }
129 }
130 }
131
132 //
133 // check for -m
134 //
135 if (ShellCommandLineGetFlag(Package, L"-m") && (WhatToDo == FileTypeNone)){
136 if (ShellCommandLineGetCount(Package) < 3) {
137 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
138 ShellStatus = SHELL_INVALID_PARAMETER;
139 } else if (ShellCommandLineGetCount(Package) > 3) {
140 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
141 ShellStatus = SHELL_INVALID_PARAMETER;
142 } else {
143 WhatToDo = FileTypeMemBuffer;
144 Offset = ShellStrToUintn(ShellCommandLineGetRawValue(Package, 1));
145 Size = ShellStrToUintn(ShellCommandLineGetRawValue(Package, 2));
146 }
147 }
148 Name = ShellCommandLineGetRawValue(Package, 1);
149 if (WhatToDo == FileTypeNone && Name != NULL) {
150 if (ShellCommandLineGetCount(Package) > 2) {
151 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
152 ShellStatus = SHELL_INVALID_PARAMETER;
153 } else if (!IsValidFileName(Name)) {
154 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Name);
155 ShellStatus = SHELL_INVALID_PARAMETER;
156 } else {
157 WhatToDo = FileTypeFileBuffer;
158 }
159 } else if (WhatToDo == FileTypeNone) {
160 if (gEfiShellProtocol->GetCurDir(NULL) == NULL) {
161 ShellStatus = SHELL_NOT_FOUND;
162 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle);
163 } else {
164 NewName = EditGetDefaultFileName(L"bin");
165 Name = NewName;
166 WhatToDo = FileTypeFileBuffer;
167 }
168 }
169
170 if (ShellStatus == SHELL_SUCCESS && WhatToDo == FileTypeNone) {
171 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
172 ShellStatus = SHELL_INVALID_PARAMETER;
173 } else if (WhatToDo == FileTypeFileBuffer && ShellGetCurrentDir(NULL) == NULL) {
174 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle);
175 ShellStatus = SHELL_INVALID_PARAMETER;
176 }
177
178 if (ShellStatus == SHELL_SUCCESS) {
179 //
180 // Do the editor
181 //
182 Status = HMainEditorInit ();
183 if (EFI_ERROR (Status)) {
184 gST->ConOut->ClearScreen (gST->ConOut);
185 gST->ConOut->EnableCursor (gST->ConOut, TRUE);
186 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_INIT_FAILED), gShellDebug1HiiHandle);
187 } else {
188 HMainEditorBackup ();
189 switch (WhatToDo) {
190 case FileTypeFileBuffer:
191 Status = HBufferImageRead (
192 Name,
193 NULL,
194 0,
195 0,
196 0,
197 0,
198 FileTypeFileBuffer,
199 FALSE
200 );
201 break;
202
203 case FileTypeDiskBuffer:
204 Status = HBufferImageRead (
205 NULL,
206 Name,
207 Offset,
208 Size,
209 0,
210 0,
211 FileTypeDiskBuffer,
212 FALSE
213 );
214 break;
215
216 case FileTypeMemBuffer:
217 Status = HBufferImageRead (
218 NULL,
219 NULL,
220 0,
221 0,
222 (UINT32) Offset,
223 Size,
224 FileTypeMemBuffer,
225 FALSE
226 );
227 break;
228
229 default:
230 Status = EFI_NOT_FOUND;
231 break;
232 }
233 if (!EFI_ERROR (Status)) {
234 HMainEditorRefresh ();
235 Status = HMainEditorKeyInput ();
236 }
237 if (Status != EFI_OUT_OF_RESOURCES) {
238 //
239 // back up the status string
240 //
241 Buffer = CatSPrint (NULL, L"%s\r\n", StatusBarGetString());
242 }
243 }
244
245 //
246 // cleanup
247 //
248 HMainEditorCleanup ();
249
250 if (!EFI_ERROR (Status)) {
251 if (ShellStatus == SHELL_SUCCESS) {
252 ShellStatus = SHELL_UNSUPPORTED;
253 }
254 }
255
256 //
257 // print editor exit code on screen
258 //
259 if (Status == EFI_OUT_OF_RESOURCES) {
260 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle);
261 } else if (EFI_ERROR(Status)){
262 if (Buffer != NULL) {
263 if (StrCmp (Buffer, L"") != 0) {
264 //
265 // print out the status string
266 //
267 ShellPrintEx(-1, -1, L"%s", Buffer);
268 } else {
269 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);
270 }
271 } else {
272 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);
273 }
274 }
275 }
276 ShellCommandLineFreeVarList (Package);
277 }
278
279 SHELL_FREE_NON_NULL (Buffer);
280 SHELL_FREE_NON_NULL (NewName);
281 return ShellStatus;
282 }