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
= {
43 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
* This
,
44 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width
,
52 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
* This
,
53 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width
,
67 Initialization function for HDiskImage
83 // basically initialize the HMemImage
85 CopyMem (&HMemImage
, &HMemImageConst
, sizeof (HMemImage
));
87 Status
= gBS
->LocateProtocol (
88 &gEfiPciRootBridgeIoProtocolGuid
,
90 (VOID
**)&HMemImage
.IoFncs
92 if (Status
== EFI_NOT_FOUND
) {
94 // For NT32, no EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL is available
95 // Use Dummy PciRootBridgeIo for memory access
97 ZeroMem (&DummyPciRootBridgeIo
, sizeof (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
));
98 DummyPciRootBridgeIo
.Mem
.Read
= DummyMemRead
;
99 DummyPciRootBridgeIo
.Mem
.Write
= DummyMemWrite
;
100 HMemImage
.IoFncs
= &DummyPciRootBridgeIo
;
101 Status
= EFI_SUCCESS
;
103 if (!EFI_ERROR (Status
)) {
106 return EFI_LOAD_ERROR
;
118 Backup function for HDiskImage
119 Only a few fields need to be backup.
120 This is for making the Disk buffer refresh
133 HMemImageBackupVar
.Offset
= HMemImage
.Offset
;
134 HMemImageBackupVar
.Size
= HMemImage
.Size
;
147 Cleanup function for HDiskImage
163 HMemImageSetMemOffsetSize (
171 Set FileName field in HFileImage
186 HMemImage
.Offset
= Offset
;
187 HMemImage
.Size
= Size
;
202 Read a disk from disk into HBufferImage
208 Recover - if is for recover, no information print
222 HEFI_EDITOR_LINE
*Line
;
224 EDIT_FILE_TYPE BufferTypeBackup
;
226 BufferTypeBackup
= HBufferImage
.BufferType
;
227 HBufferImage
.BufferType
= FileTypeMemBuffer
;
229 Buffer
= AllocateZeroPool (Size
);
230 if (Buffer
== NULL
) {
231 StatusBarSetStatusString (L
"Read Memory Failed");
232 return EFI_OUT_OF_RESOURCES
;
235 Status
= HMemImage
.IoFncs
->Mem
.Read (
243 if (EFI_ERROR (Status
)) {
245 StatusBarSetStatusString (L
"Memory Specified Not Accessible");
246 return EFI_LOAD_ERROR
;
251 Status
= HBufferImageBufferToList (Buffer
, Size
);
254 if (EFI_ERROR (Status
)) {
255 StatusBarSetStatusString (L
"Read Memory Failed");
259 Status
= HMemImageSetMemOffsetSize (Offset
, Size
);
261 HBufferImage
.DisplayPosition
.Row
= 2;
262 HBufferImage
.DisplayPosition
.Column
= 10;
264 HBufferImage
.MousePosition
.Row
= 2;
265 HBufferImage
.MousePosition
.Column
= 10;
267 HBufferImage
.LowVisibleRow
= 1;
268 HBufferImage
.HighBits
= TRUE
;
270 HBufferImage
.BufferPosition
.Row
= 1;
271 HBufferImage
.BufferPosition
.Column
= 1;
274 Str
= CatSPrint(NULL
, L
"%d Lines Read", HBufferImage
.NumLines
);
276 StatusBarSetStatusString (L
"Read Memory Failed");
277 return EFI_OUT_OF_RESOURCES
;
280 StatusBarSetStatusString (Str
);
281 SHELL_FREE_NON_NULL (Str
);
283 HMainEditor
.SelectStart
= 0;
284 HMainEditor
.SelectEnd
= 0;
291 if (HBufferImage
.Lines
!= NULL
) {
292 HBufferImage
.CurrentLine
= CR (HBufferImage
.ListHead
->ForwardLink
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
295 // create a dummy line
297 Line
= HBufferImageCreateLine ();
299 StatusBarSetStatusString (L
"Read Memory Failed");
300 return EFI_OUT_OF_RESOURCES
;
303 HBufferImage
.CurrentLine
= Line
;
306 HBufferImage
.Modified
= FALSE
;
307 HBufferImageNeedRefresh
= TRUE
;
308 HBufferImageOnlyLineNeedRefresh
= FALSE
;
309 HBufferImageMouseNeedRefresh
= TRUE
;
324 Save lines in HBufferImage to disk
343 EDIT_FILE_TYPE BufferTypeBackup
;
346 // not modified, so directly return
348 if (HBufferImage
.Modified
== FALSE
) {
352 BufferTypeBackup
= HBufferImage
.BufferType
;
353 HBufferImage
.BufferType
= FileTypeMemBuffer
;
355 Buffer
= AllocateZeroPool (Size
);
357 if (Buffer
== NULL
) {
358 return EFI_OUT_OF_RESOURCES
;
361 Status
= HBufferImageListToBuffer (Buffer
, Size
);
362 if (EFI_ERROR (Status
)) {
367 // write back to memory
369 Status
= HMemImage
.IoFncs
->Mem
.Write (
379 if (EFI_ERROR (Status
)) {
380 return EFI_LOAD_ERROR
;
385 HBufferImage
.Modified
= FALSE
;
392 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
* This
,
393 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width
,
399 return EFI_UNSUPPORTED
;
404 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
* This
,
405 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width
,
411 return EFI_UNSUPPORTED
;