2 Main entry point of editor
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
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.
15 #include "UefiShellDebug1CommandsLib.h"
16 #include "HexEditor.h"
21 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
29 Function for 'hexedit' command.
31 @param[in] ImageHandle Handle to the Image (NULL if Internal).
32 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
36 ShellCommandRunHexEdit (
37 IN EFI_HANDLE ImageHandle
,
38 IN EFI_SYSTEM_TABLE
*SystemTable
44 SHELL_STATUS ShellStatus
;
53 EDIT_FILE_TYPE WhatToDo
;
56 ShellStatus
= SHELL_SUCCESS
;
65 WhatToDo
= FileTypeNone
;
68 // initialize the shell lib (we must be in non-auto-init...)
70 Status
= ShellInitialize();
71 ASSERT_EFI_ERROR(Status
);
73 Status
= CommandInit();
74 ASSERT_EFI_ERROR(Status
);
77 // parse the command line
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
;
92 if (ShellCommandLineGetFlag(Package
, L
"-d")){
93 if (ShellCommandLineGetCount(Package
) > 4) {
94 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
95 ShellStatus
= SHELL_INVALID_PARAMETER
;
97 WhatToDo
= FileTypeDiskBuffer
;
98 Name
= ShellCommandLineGetRawValue(Package
, 1);
99 Offset
= ShellStrToUintn(ShellCommandLineGetRawValue(Package
, 2));
100 Size
= ShellStrToUintn(ShellCommandLineGetRawValue(Package
, 3));
107 if (ShellCommandLineGetFlag(Package
, L
"-f") && (WhatToDo
== FileTypeNone
)){
108 if (ShellCommandLineGetCount(Package
) > 2) {
109 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
110 ShellStatus
= SHELL_INVALID_PARAMETER
;
112 Name
= ShellCommandLineGetRawValue(Package
, 1);
113 if (Name
== NULL
|| !IsValidFileName(Name
)) {
114 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Name
);
115 ShellStatus
= SHELL_INVALID_PARAMETER
;
117 WhatToDo
= FileTypeFileBuffer
;
125 if (ShellCommandLineGetFlag(Package
, L
"-m") && (WhatToDo
== FileTypeNone
)){
126 if (ShellCommandLineGetCount(Package
) < 3) {
127 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
128 ShellStatus
= SHELL_INVALID_PARAMETER
;
129 } else if (ShellCommandLineGetCount(Package
) > 3) {
130 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
131 ShellStatus
= SHELL_INVALID_PARAMETER
;
133 WhatToDo
= FileTypeMemBuffer
;
134 Offset
= ShellStrToUintn(ShellCommandLineGetRawValue(Package
, 1));
135 Size
= ShellStrToUintn(ShellCommandLineGetRawValue(Package
, 2));
138 Name
= ShellCommandLineGetRawValue(Package
, 1);
139 if (WhatToDo
== FileTypeNone
&& Name
!= NULL
) {
140 if (!IsValidFileName(Name
)) {
141 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Name
);
142 ShellStatus
= SHELL_INVALID_PARAMETER
;
144 WhatToDo
= FileTypeFileBuffer
;
146 } else if (WhatToDo
== FileTypeNone
) {
147 if (gEfiShellProtocol
->GetCurDir(NULL
) == NULL
) {
148 ShellStatus
= SHELL_NOT_FOUND
;
149 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_CWD
), gShellDebug1HiiHandle
);
151 NewName
= EditGetDefaultFileName(L
"bin");
153 WhatToDo
= FileTypeFileBuffer
;
157 if (ShellStatus
== SHELL_SUCCESS
&& WhatToDo
== FileTypeNone
) {
158 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
159 ShellStatus
= SHELL_INVALID_PARAMETER
;
162 if (ShellStatus
== SHELL_SUCCESS
) {
166 Status
= HMainEditorInit ();
167 if (EFI_ERROR (Status
)) {
168 gST
->ConOut
->ClearScreen (gST
->ConOut
);
169 gST
->ConOut
->EnableCursor (gST
->ConOut
, TRUE
);
170 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_INIT_FAILED
), gShellDebug1HiiHandle
);
172 HMainEditorBackup ();
174 case FileTypeFileBuffer
:
175 Status
= HBufferImageRead (
187 case FileTypeDiskBuffer
:
188 Status
= HBufferImageRead (
200 case FileTypeMemBuffer
:
201 Status
= HBufferImageRead (
214 if (!EFI_ERROR (Status
)) {
215 HMainEditorRefresh ();
216 Status
= HMainEditorKeyInput ();
218 if (Status
!= EFI_OUT_OF_RESOURCES
) {
220 // back up the status string
222 Buffer
= CatSPrint (NULL
, L
"%s", StatusBarGetString());
229 HMainEditorCleanup ();
231 if (!EFI_ERROR (Status
)) {
232 if (ShellStatus
== SHELL_SUCCESS
) {
233 ShellStatus
= SHELL_UNSUPPORTED
;
238 // print editor exit code on screen
240 if (Status
== EFI_OUT_OF_RESOURCES
) {
241 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_OUT_MEM
), gShellDebug1HiiHandle
);
242 } else if (EFI_ERROR(Status
)){
243 if (Buffer
!= NULL
) {
244 if (StrCmp (Buffer
, L
"") != 0) {
246 // print out the status string
248 ShellPrintEx(-1, -1, L
"%s", gShellDebug1HiiHandle
, Buffer
);
250 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR
), gShellDebug1HiiHandle
);
253 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR
), gShellDebug1HiiHandle
);
257 ShellCommandLineFreeVarList (Package
);
260 SHELL_FREE_NON_NULL (Buffer
);
261 SHELL_FREE_NON_NULL (NewName
);