2 Functions to deal with Mem buffer
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 "HexEditor.h"
17 extern EFI_HANDLE HImageHandleBackup
;
19 extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage
;
21 extern BOOLEAN HBufferImageNeedRefresh
;
22 extern BOOLEAN HBufferImageOnlyLineNeedRefresh
;
23 extern BOOLEAN HBufferImageMouseNeedRefresh
;
25 extern HEFI_EDITOR_GLOBAL_EDITOR HMainEditor
;
27 HEFI_EDITOR_MEM_IMAGE HMemImage
;
28 HEFI_EDITOR_MEM_IMAGE HMemImageBackupVar
;
30 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL DummyPciRootBridgeIo
;
33 // for basic initialization of HDiskImage
35 HEFI_EDITOR_MEM_IMAGE HMemImageConst
= {
42 Empty function. always returns the same.
44 @param[in] This Ignored.
45 @param[in] Width Ignored.
46 @param[in] Address Ignored.
47 @param[in] Count Ignored.
48 @param[in,out] Buffer Ignored.
50 @retval EFI_UNSUPPORTED.
54 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
* This
,
55 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width
,
61 return EFI_UNSUPPORTED
;
65 Empty function. always returns the same.
67 @param[in] This Ignored.
68 @param[in] Width Ignored.
69 @param[in] Address Ignored.
70 @param[in] Count Ignored.
71 @param[in,out] Buffer Ignored.
73 @retval EFI_UNSUPPORTED.
77 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
* This
,
78 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width
,
84 return EFI_UNSUPPORTED
;
88 Initialization function for HDiskImage.
90 @retval EFI_SUCCESS The operation was successful.
91 @retval EFI_LOAD_ERROR A load error occured.
101 // basically initialize the HMemImage
103 CopyMem (&HMemImage
, &HMemImageConst
, sizeof (HMemImage
));
105 Status
= gBS
->LocateProtocol (
106 &gEfiPciRootBridgeIoProtocolGuid
,
108 (VOID
**)&HMemImage
.IoFncs
110 if (Status
== EFI_NOT_FOUND
) {
112 // For NT32, no EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL is available
113 // Use Dummy PciRootBridgeIo for memory access
115 ZeroMem (&DummyPciRootBridgeIo
, sizeof (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
));
116 DummyPciRootBridgeIo
.Mem
.Read
= DummyMemRead
;
117 DummyPciRootBridgeIo
.Mem
.Write
= DummyMemWrite
;
118 HMemImage
.IoFncs
= &DummyPciRootBridgeIo
;
119 Status
= EFI_SUCCESS
;
121 if (!EFI_ERROR (Status
)) {
124 return EFI_LOAD_ERROR
;
129 Backup function for HDiskImage. Only a few fields need to be backup.
130 This is for making the Disk buffer refresh as few as possible.
132 @retval EFI_SUCCESS The operation was successful.
139 HMemImageBackupVar
.Offset
= HMemImage
.Offset
;
140 HMemImageBackupVar
.Size
= HMemImage
.Size
;
146 Set FileName field in HFileImage.
148 @param[in] Offset The offset.
149 @param[in] Size The size.
151 @retval EFI_SUCCESS The operation was successful.
152 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
155 HMemImageSetMemOffsetSize (
161 HMemImage
.Offset
= Offset
;
162 HMemImage
.Size
= Size
;
168 Read a disk from disk into HBufferImage.
170 @param[in] Offset The offset.
171 @param[in] Size The size.
172 @param[in] Recover if is for recover, no information print.
174 @retval EFI_LOAD_ERROR A load error occured.
175 @retval EFI_SUCCESS The operation was successful.
176 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
189 HEFI_EDITOR_LINE
*Line
;
191 EDIT_FILE_TYPE BufferTypeBackup
;
193 BufferTypeBackup
= HBufferImage
.BufferType
;
194 HBufferImage
.BufferType
= FileTypeMemBuffer
;
196 Buffer
= AllocateZeroPool (Size
);
197 if (Buffer
== NULL
) {
198 StatusBarSetStatusString (L
"Read Memory Failed");
199 return EFI_OUT_OF_RESOURCES
;
202 Status
= HMemImage
.IoFncs
->Mem
.Read (
210 if (EFI_ERROR (Status
)) {
212 StatusBarSetStatusString (L
"Memory Specified Not Accessible");
213 return EFI_LOAD_ERROR
;
218 Status
= HBufferImageBufferToList (Buffer
, Size
);
221 if (EFI_ERROR (Status
)) {
222 StatusBarSetStatusString (L
"Read Memory Failed");
226 Status
= HMemImageSetMemOffsetSize (Offset
, Size
);
228 HBufferImage
.DisplayPosition
.Row
= 2;
229 HBufferImage
.DisplayPosition
.Column
= 10;
231 HBufferImage
.MousePosition
.Row
= 2;
232 HBufferImage
.MousePosition
.Column
= 10;
234 HBufferImage
.LowVisibleRow
= 1;
235 HBufferImage
.HighBits
= TRUE
;
237 HBufferImage
.BufferPosition
.Row
= 1;
238 HBufferImage
.BufferPosition
.Column
= 1;
241 Str
= CatSPrint(NULL
, L
"%d Lines Read", HBufferImage
.NumLines
);
243 StatusBarSetStatusString (L
"Read Memory Failed");
244 return EFI_OUT_OF_RESOURCES
;
247 StatusBarSetStatusString (Str
);
248 SHELL_FREE_NON_NULL (Str
);
250 HMainEditor
.SelectStart
= 0;
251 HMainEditor
.SelectEnd
= 0;
258 if (HBufferImage
.Lines
!= NULL
) {
259 HBufferImage
.CurrentLine
= CR (HBufferImage
.ListHead
->ForwardLink
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
262 // create a dummy line
264 Line
= HBufferImageCreateLine ();
266 StatusBarSetStatusString (L
"Read Memory Failed");
267 return EFI_OUT_OF_RESOURCES
;
270 HBufferImage
.CurrentLine
= Line
;
273 HBufferImage
.Modified
= FALSE
;
274 HBufferImageNeedRefresh
= TRUE
;
275 HBufferImageOnlyLineNeedRefresh
= FALSE
;
276 HBufferImageMouseNeedRefresh
= TRUE
;
283 Save lines in HBufferImage to disk.
285 @param[in] Offset The offset.
286 @param[in] Size The size.
288 @retval EFI_LOAD_ERROR A load error occured.
289 @retval EFI_SUCCESS The operation was successful.
290 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
302 EDIT_FILE_TYPE BufferTypeBackup
;
305 // not modified, so directly return
307 if (HBufferImage
.Modified
== FALSE
) {
311 BufferTypeBackup
= HBufferImage
.BufferType
;
312 HBufferImage
.BufferType
= FileTypeMemBuffer
;
314 Buffer
= AllocateZeroPool (Size
);
316 if (Buffer
== NULL
) {
317 return EFI_OUT_OF_RESOURCES
;
320 Status
= HBufferImageListToBuffer (Buffer
, Size
);
321 if (EFI_ERROR (Status
)) {
326 // write back to memory
328 Status
= HMemImage
.IoFncs
->Mem
.Write (
338 if (EFI_ERROR (Status
)) {
339 return EFI_LOAD_ERROR
;
344 HBufferImage
.Modified
= FALSE
;