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