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