]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c
add user input verification.
[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 (!IsValidFileName(Name)) {
151 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Name);
152 ShellStatus = SHELL_INVALID_PARAMETER;
153 } else {
154 WhatToDo = FileTypeFileBuffer;
155 }
156 } else if (WhatToDo == FileTypeNone) {
157 if (gEfiShellProtocol->GetCurDir(NULL) == NULL) {
158 ShellStatus = SHELL_NOT_FOUND;
159 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle);
160 } else {
161 NewName = EditGetDefaultFileName(L"bin");
162 Name = NewName;
163 WhatToDo = FileTypeFileBuffer;
164 }
165 }
166
167 if (ShellStatus == SHELL_SUCCESS && WhatToDo == FileTypeNone) {
168 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
169 ShellStatus = SHELL_INVALID_PARAMETER;
170 } else if (WhatToDo == FileTypeFileBuffer && ShellGetCurrentDir(NULL) == NULL) {
171 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle);
172 ShellStatus = SHELL_INVALID_PARAMETER;
173 }
174
175 if (ShellStatus == SHELL_SUCCESS) {
176 //
177 // Do the editor
178 //
179 Status = HMainEditorInit ();
180 if (EFI_ERROR (Status)) {
181 gST->ConOut->ClearScreen (gST->ConOut);
182 gST->ConOut->EnableCursor (gST->ConOut, TRUE);
183 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_INIT_FAILED), gShellDebug1HiiHandle);
184 } else {
185 HMainEditorBackup ();
186 switch (WhatToDo) {
187 case FileTypeFileBuffer:
188 Status = HBufferImageRead (
189 Name,
190 NULL,
191 0,
192 0,
193 0,
194 0,
195 FileTypeFileBuffer,
196 FALSE
197 );
198 break;
199
200 case FileTypeDiskBuffer:
201 Status = HBufferImageRead (
202 NULL,
203 Name,
204 Offset,
205 Size,
206 0,
207 0,
208 FileTypeDiskBuffer,
209 FALSE
210 );
211 break;
212
213 case FileTypeMemBuffer:
214 Status = HBufferImageRead (
215 NULL,
216 NULL,
217 0,
218 0,
219 (UINT32) Offset,
220 Size,
221 FileTypeMemBuffer,
222 FALSE
223 );
224 break;
225
226 }
227 if (!EFI_ERROR (Status)) {
228 HMainEditorRefresh ();
229 Status = HMainEditorKeyInput ();
230 }
231 if (Status != EFI_OUT_OF_RESOURCES) {
232 //
233 // back up the status string
234 //
235 Buffer = CatSPrint (NULL, L"%s", StatusBarGetString());
236 }
237 }
238
239 //
240 // cleanup
241 //
242 HMainEditorCleanup ();
243
244 if (!EFI_ERROR (Status)) {
245 if (ShellStatus == SHELL_SUCCESS) {
246 ShellStatus = SHELL_UNSUPPORTED;
247 }
248 }
249
250 //
251 // print editor exit code on screen
252 //
253 if (Status == EFI_OUT_OF_RESOURCES) {
254 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle);
255 } else if (EFI_ERROR(Status)){
256 if (Buffer != NULL) {
257 if (StrCmp (Buffer, L"") != 0) {
258 //
259 // print out the status string
260 //
261 ShellPrintEx(-1, -1, L"%s", gShellDebug1HiiHandle, Buffer);
262 } else {
263 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);
264 }
265 } else {
266 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);
267 }
268 }
269 }
270 ShellCommandLineFreeVarList (Package);
271 }
272
273 SHELL_FREE_NON_NULL (Buffer);
274 SHELL_FREE_NON_NULL (NewName);
275 return ShellStatus;
276 }