]> git.proxmox.com Git - mirror_edk2.git/blame - 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
632820d1 1/** @file\r
2 Main entry point of editor\r
ba0014b9 3\r
c011b6c9 4 (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 5 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>\r
56ba3746 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
632820d1 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
47d20b54
MK
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
632820d1 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
47d20b54
MK
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
632820d1 46\r
47 Buffer = NULL;\r
48 ShellStatus = SHELL_SUCCESS;\r
47d20b54 49 NewName = NULL;\r
632820d1 50 Buffer = NULL;\r
51 Name = NULL;\r
632820d1 52 Offset = 0;\r
53 Size = 0;\r
632820d1 54 WhatToDo = FileTypeNone;\r
55\r
56 //\r
57 // initialize the shell lib (we must be in non-auto-init...)\r
58 //\r
47d20b54
MK
59 Status = ShellInitialize ();\r
60 ASSERT_EFI_ERROR (Status);\r
632820d1 61\r
47d20b54
MK
62 Status = CommandInit ();\r
63 ASSERT_EFI_ERROR (Status);\r
632820d1 64\r
65 //\r
66 // parse the command line\r
67 //\r
68 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
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
632820d1 73 ShellStatus = SHELL_INVALID_PARAMETER;\r
74 } else {\r
47d20b54 75 ASSERT (FALSE);\r
632820d1 76 }\r
77 } else {\r
78 //\r
79 // Check for -d\r
80 //\r
47d20b54
MK
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
392fa5a6 84 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
85 } else if (ShellCommandLineGetCount (Package) > 4) {\r
86 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit");\r
632820d1 87 ShellStatus = SHELL_INVALID_PARAMETER;\r
88 } else {\r
89 WhatToDo = FileTypeDiskBuffer;\r
47d20b54
MK
90 Name = ShellCommandLineGetRawValue (Package, 1);\r
91 Offset = ShellStrToUintn (ShellCommandLineGetRawValue (Package, 2));\r
92 Size = ShellStrToUintn (ShellCommandLineGetRawValue (Package, 3));\r
632820d1 93 }\r
47d20b54
MK
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
392fa5a6 97 ShellStatus = SHELL_INVALID_PARAMETER;\r
98 }\r
632820d1 99 }\r
100\r
101 //\r
102 // check for -f\r
103 //\r
47d20b54
MK
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
392fa5a6 107 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
108 } else if (ShellCommandLineGetCount (Package) > 2) {\r
109 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit");\r
632820d1 110 ShellStatus = SHELL_INVALID_PARAMETER;\r
111 } else {\r
47d20b54
MK
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
632820d1 115 ShellStatus = SHELL_INVALID_PARAMETER;\r
116 } else {\r
47d20b54 117 WhatToDo = FileTypeFileBuffer;\r
632820d1 118 }\r
119 }\r
120 }\r
121\r
122 //\r
123 // check for -m\r
124 //\r
47d20b54
MK
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
632820d1 128 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
129 } else if (ShellCommandLineGetCount (Package) > 3) {\r
130 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit");\r
632820d1 131 ShellStatus = SHELL_INVALID_PARAMETER;\r
132 } else {\r
133 WhatToDo = FileTypeMemBuffer;\r
47d20b54
MK
134 Offset = ShellStrToUintn (ShellCommandLineGetRawValue (Package, 1));\r
135 Size = ShellStrToUintn (ShellCommandLineGetRawValue (Package, 2));\r
632820d1 136 }\r
137 }\r
47d20b54
MK
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
411a3c39 143 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
144 } else if (!IsValidFileName (Name)) {\r
145 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"hexedit", Name);\r
411a3c39 146 ShellStatus = SHELL_INVALID_PARAMETER;\r
147 } else {\r
47d20b54 148 WhatToDo = FileTypeFileBuffer;\r
411a3c39 149 }\r
980d554e 150 } else if (WhatToDo == FileTypeNone) {\r
47d20b54 151 if (gEfiShellProtocol->GetCurDir (NULL) == NULL) {\r
980d554e 152 ShellStatus = SHELL_NOT_FOUND;\r
47d20b54 153 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle, L"hexedit");\r
980d554e 154 } else {\r
47d20b54
MK
155 NewName = EditGetDefaultFileName (L"bin");\r
156 Name = NewName;\r
157 WhatToDo = FileTypeFileBuffer;\r
980d554e 158 }\r
159 }\r
632820d1 160\r
47d20b54
MK
161 if ((ShellStatus == SHELL_SUCCESS) && (WhatToDo == FileTypeNone)) {\r
162 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit");\r
632820d1 163 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
164 } else if ((WhatToDo == FileTypeFileBuffer) && (ShellGetCurrentDir (NULL) == NULL)) {\r
165 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle, L"hexedit");\r
392fa5a6 166 ShellStatus = SHELL_INVALID_PARAMETER;\r
e0c2cc6f 167 }\r
632820d1 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
47d20b54 177 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_INIT_FAILED), gShellDebug1HiiHandle);\r
632820d1 178 } else {\r
179 HMainEditorBackup ();\r
180 switch (WhatToDo) {\r
47d20b54
MK
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
632820d1 193\r
47d20b54
MK
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
632820d1 206\r
47d20b54
MK
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
632820d1 219\r
47d20b54
MK
220 default:\r
221 Status = EFI_NOT_FOUND;\r
222 break;\r
632820d1 223 }\r
47d20b54 224\r
632820d1 225 if (!EFI_ERROR (Status)) {\r
226 HMainEditorRefresh ();\r
227 Status = HMainEditorKeyInput ();\r
228 }\r
47d20b54 229\r
632820d1 230 if (Status != EFI_OUT_OF_RESOURCES) {\r
231 //\r
232 // back up the status string\r
233 //\r
47d20b54 234 Buffer = CatSPrint (NULL, L"%s\r\n", StatusBarGetString ());\r
632820d1 235 }\r
236 }\r
237\r
238 //\r
239 // cleanup\r
240 //\r
241 HMainEditorCleanup ();\r
242\r
842949fa 243 if (EFI_ERROR (Status)) {\r
632820d1 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
47d20b54
MK
253 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"hexedit");\r
254 } else if (EFI_ERROR (Status)) {\r
632820d1 255 if (Buffer != NULL) {\r
256 if (StrCmp (Buffer, L"") != 0) {\r
257 //\r
258 // print out the status string\r
259 //\r
47d20b54 260 ShellPrintEx (-1, -1, L"%s", Buffer);\r
632820d1 261 } else {\r
47d20b54 262 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);\r
632820d1 263 }\r
264 } else {\r
47d20b54 265 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);\r
632820d1 266 }\r
267 }\r
268 }\r
47d20b54 269\r
980d554e 270 ShellCommandLineFreeVarList (Package);\r
632820d1 271 }\r
272\r
273 SHELL_FREE_NON_NULL (Buffer);\r
980d554e 274 SHELL_FREE_NON_NULL (NewName);\r
632820d1 275 return ShellStatus;\r
276}\r