2 Functions to deal with Mem buffer
4 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
11 extern EFI_HANDLE HImageHandleBackup
;
13 extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage
;
15 extern BOOLEAN HBufferImageNeedRefresh
;
16 extern BOOLEAN HBufferImageOnlyLineNeedRefresh
;
17 extern BOOLEAN HBufferImageMouseNeedRefresh
;
19 extern HEFI_EDITOR_GLOBAL_EDITOR HMainEditor
;
21 HEFI_EDITOR_MEM_IMAGE HMemImage
;
22 HEFI_EDITOR_MEM_IMAGE HMemImageBackupVar
;
25 // for basic initialization of HDiskImage
27 HEFI_EDITOR_MEM_IMAGE HMemImageConst
= {
34 Initialization function for HDiskImage.
36 @retval EFI_SUCCESS The operation was successful.
37 @retval EFI_LOAD_ERROR A load error occurred.
47 // basically initialize the HMemImage
49 CopyMem (&HMemImage
, &HMemImageConst
, sizeof (HMemImage
));
51 Status
= gBS
->LocateProtocol (
52 &gEfiCpuIo2ProtocolGuid
,
54 (VOID
**)&HMemImage
.IoFncs
56 if (!EFI_ERROR (Status
)) {
59 return EFI_LOAD_ERROR
;
64 Backup function for HDiskImage. Only a few fields need to be backup.
65 This is for making the Disk buffer refresh as few as possible.
67 @retval EFI_SUCCESS The operation was successful.
74 HMemImageBackupVar
.Offset
= HMemImage
.Offset
;
75 HMemImageBackupVar
.Size
= HMemImage
.Size
;
81 Set FileName field in HFileImage.
83 @param[in] Offset The offset.
84 @param[in] Size The size.
86 @retval EFI_SUCCESS The operation was successful.
87 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
90 HMemImageSetMemOffsetSize (
95 HMemImage
.Offset
= Offset
;
96 HMemImage
.Size
= Size
;
102 Read a disk from disk into HBufferImage.
104 @param[in] Offset The offset.
105 @param[in] Size The size.
106 @param[in] Recover if is for recover, no information print.
108 @retval EFI_LOAD_ERROR A load error occurred.
109 @retval EFI_SUCCESS The operation was successful.
110 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
122 HEFI_EDITOR_LINE
*Line
;
124 HBufferImage
.BufferType
= FileTypeMemBuffer
;
126 Buffer
= AllocateZeroPool (Size
);
127 if (Buffer
== NULL
) {
128 StatusBarSetStatusString (L
"Read Memory Failed");
129 return EFI_OUT_OF_RESOURCES
;
132 Status
= HMemImage
.IoFncs
->Mem
.Read (
140 if (EFI_ERROR (Status
)) {
142 StatusBarSetStatusString (L
"Memory Specified Not Accessible");
143 return EFI_LOAD_ERROR
;
148 Status
= HBufferImageBufferToList (Buffer
, Size
);
151 if (EFI_ERROR (Status
)) {
152 StatusBarSetStatusString (L
"Read Memory Failed");
156 Status
= HMemImageSetMemOffsetSize (Offset
, Size
);
158 HBufferImage
.DisplayPosition
.Row
= 2;
159 HBufferImage
.DisplayPosition
.Column
= 10;
161 HBufferImage
.MousePosition
.Row
= 2;
162 HBufferImage
.MousePosition
.Column
= 10;
164 HBufferImage
.LowVisibleRow
= 1;
165 HBufferImage
.HighBits
= TRUE
;
167 HBufferImage
.BufferPosition
.Row
= 1;
168 HBufferImage
.BufferPosition
.Column
= 1;
171 Str
= CatSPrint (NULL
, L
"%d Lines Read", HBufferImage
.NumLines
);
173 StatusBarSetStatusString (L
"Read Memory Failed");
174 return EFI_OUT_OF_RESOURCES
;
177 StatusBarSetStatusString (Str
);
178 SHELL_FREE_NON_NULL (Str
);
180 HMainEditor
.SelectStart
= 0;
181 HMainEditor
.SelectEnd
= 0;
187 if (HBufferImage
.Lines
!= NULL
) {
188 HBufferImage
.CurrentLine
= CR (HBufferImage
.ListHead
->ForwardLink
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
191 // create a dummy line
193 Line
= HBufferImageCreateLine ();
195 StatusBarSetStatusString (L
"Read Memory Failed");
196 return EFI_OUT_OF_RESOURCES
;
199 HBufferImage
.CurrentLine
= Line
;
202 HBufferImage
.Modified
= FALSE
;
203 HBufferImageNeedRefresh
= TRUE
;
204 HBufferImageOnlyLineNeedRefresh
= FALSE
;
205 HBufferImageMouseNeedRefresh
= TRUE
;
211 Save lines in HBufferImage to disk.
213 @param[in] Offset The offset.
214 @param[in] Size The size.
216 @retval EFI_LOAD_ERROR A load error occurred.
217 @retval EFI_SUCCESS The operation was successful.
218 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
230 // not modified, so directly return
232 if (HBufferImage
.Modified
== FALSE
) {
236 HBufferImage
.BufferType
= FileTypeMemBuffer
;
238 Buffer
= AllocateZeroPool (Size
);
240 if (Buffer
== NULL
) {
241 return EFI_OUT_OF_RESOURCES
;
244 Status
= HBufferImageListToBuffer (Buffer
, Size
);
245 if (EFI_ERROR (Status
)) {
251 // write back to memory
253 Status
= HMemImage
.IoFncs
->Mem
.Write (
263 if (EFI_ERROR (Status
)) {
264 return EFI_LOAD_ERROR
;
270 HBufferImage
.Modified
= FALSE
;