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_FEW
), gShellDebug1HiiHandle
);
95 ShellStatus
= SHELL_INVALID_PARAMETER
;
96 } else if (ShellCommandLineGetCount(Package
) > 4) {
97 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
98 ShellStatus
= SHELL_INVALID_PARAMETER
;
100 WhatToDo
= FileTypeDiskBuffer
;
101 Name
= ShellCommandLineGetRawValue(Package
, 1);
102 Offset
= ShellStrToUintn(ShellCommandLineGetRawValue(Package
, 2));
103 Size
= ShellStrToUintn(ShellCommandLineGetRawValue(Package
, 3));
110 if (ShellCommandLineGetFlag(Package
, L
"-f") && (WhatToDo
== FileTypeNone
)){
111 if (ShellCommandLineGetCount(Package
) > 2) {
112 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
113 ShellStatus
= SHELL_INVALID_PARAMETER
;
115 Name
= ShellCommandLineGetRawValue(Package
, 1);
116 if (!IsValidFileName(Name
)) {
117 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Name
);
118 ShellStatus
= SHELL_INVALID_PARAMETER
;
120 WhatToDo
= FileTypeFileBuffer
;
128 if (ShellCommandLineGetFlag(Package
, L
"-m") && (WhatToDo
== FileTypeNone
)){
129 if (ShellCommandLineGetCount(Package
) < 3) {
130 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
131 ShellStatus
= SHELL_INVALID_PARAMETER
;
132 } else if (ShellCommandLineGetCount(Package
) > 3) {
133 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
134 ShellStatus
= SHELL_INVALID_PARAMETER
;
136 WhatToDo
= FileTypeMemBuffer
;
137 Offset
= ShellStrToUintn(ShellCommandLineGetRawValue(Package
, 1));
138 Size
= ShellStrToUintn(ShellCommandLineGetRawValue(Package
, 2));
141 ShellCommandLineFreeVarList (Package
);
143 if (ShellStatus
== SHELL_SUCCESS
&& WhatToDo
== FileTypeNone
) {
144 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
145 ShellStatus
= SHELL_INVALID_PARAMETER
;
148 if (ShellStatus
== SHELL_SUCCESS
) {
152 Status
= HMainEditorInit ();
153 if (EFI_ERROR (Status
)) {
154 gST
->ConOut
->ClearScreen (gST
->ConOut
);
155 gST
->ConOut
->EnableCursor (gST
->ConOut
, TRUE
);
156 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_INIT_FAILED
), gShellDebug1HiiHandle
);
158 HMainEditorBackup ();
160 case FileTypeFileBuffer
:
161 Status
= HBufferImageRead (
173 case FileTypeDiskBuffer
:
174 Status
= HBufferImageRead (
186 case FileTypeMemBuffer
:
187 Status
= HBufferImageRead (
200 if (!EFI_ERROR (Status
)) {
201 HMainEditorRefresh ();
202 Status
= HMainEditorKeyInput ();
204 if (Status
!= EFI_OUT_OF_RESOURCES
) {
206 // back up the status string
208 Buffer
= CatSPrint (NULL
, L
"%s", StatusBarGetString());
215 HMainEditorCleanup ();
217 if (!EFI_ERROR (Status
)) {
218 if (ShellStatus
== SHELL_SUCCESS
) {
219 ShellStatus
= SHELL_UNSUPPORTED
;
224 // print editor exit code on screen
226 if (Status
== EFI_OUT_OF_RESOURCES
) {
227 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_OUT_MEM
), gShellDebug1HiiHandle
);
228 } else if (EFI_ERROR(Status
)){
229 if (Buffer
!= NULL
) {
230 if (StrCmp (Buffer
, L
"") != 0) {
232 // print out the status string
234 ShellPrintEx(-1, -1, L
"%s", gShellDebug1HiiHandle
, Buffer
);
236 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR
), gShellDebug1HiiHandle
);
239 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR
), gShellDebug1HiiHandle
);
245 SHELL_FREE_NON_NULL (Buffer
);