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