123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- /** @file
- Functions to deal with Mem buffer
- Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "HexEditor.h"
- extern EFI_HANDLE HImageHandleBackup;
- extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage;
- extern BOOLEAN HBufferImageNeedRefresh;
- extern BOOLEAN HBufferImageOnlyLineNeedRefresh;
- extern BOOLEAN HBufferImageMouseNeedRefresh;
- extern HEFI_EDITOR_GLOBAL_EDITOR HMainEditor;
- HEFI_EDITOR_MEM_IMAGE HMemImage;
- HEFI_EDITOR_MEM_IMAGE HMemImageBackupVar;
- //
- // for basic initialization of HDiskImage
- //
- HEFI_EDITOR_MEM_IMAGE HMemImageConst = {
- NULL,
- 0,
- 0
- };
- /**
- Initialization function for HDiskImage.
- @retval EFI_SUCCESS The operation was successful.
- @retval EFI_LOAD_ERROR A load error occurred.
- **/
- EFI_STATUS
- HMemImageInit (
- VOID
- )
- {
- EFI_STATUS Status;
- //
- // basically initialize the HMemImage
- //
- CopyMem (&HMemImage, &HMemImageConst, sizeof (HMemImage));
- Status = gBS->LocateProtocol (
- &gEfiCpuIo2ProtocolGuid,
- NULL,
- (VOID**)&HMemImage.IoFncs
- );
- if (!EFI_ERROR (Status)) {
- return EFI_SUCCESS;
- } else {
- return EFI_LOAD_ERROR;
- }
- }
- /**
- Backup function for HDiskImage. Only a few fields need to be backup.
- This is for making the Disk buffer refresh as few as possible.
- @retval EFI_SUCCESS The operation was successful.
- **/
- EFI_STATUS
- HMemImageBackup (
- VOID
- )
- {
- HMemImageBackupVar.Offset = HMemImage.Offset;
- HMemImageBackupVar.Size = HMemImage.Size;
- return EFI_SUCCESS;
- }
- /**
- Set FileName field in HFileImage.
- @param[in] Offset The offset.
- @param[in] Size The size.
- @retval EFI_SUCCESS The operation was successful.
- @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
- **/
- EFI_STATUS
- HMemImageSetMemOffsetSize (
- IN UINTN Offset,
- IN UINTN Size
- )
- {
- HMemImage.Offset = Offset;
- HMemImage.Size = Size;
- return EFI_SUCCESS;
- }
- /**
- Read a disk from disk into HBufferImage.
- @param[in] Offset The offset.
- @param[in] Size The size.
- @param[in] Recover if is for recover, no information print.
- @retval EFI_LOAD_ERROR A load error occurred.
- @retval EFI_SUCCESS The operation was successful.
- @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
- **/
- EFI_STATUS
- HMemImageRead (
- IN UINTN Offset,
- IN UINTN Size,
- IN BOOLEAN Recover
- )
- {
- EFI_STATUS Status;
- void *Buffer;
- CHAR16 *Str;
- HEFI_EDITOR_LINE *Line;
- HBufferImage.BufferType = FileTypeMemBuffer;
- Buffer = AllocateZeroPool (Size);
- if (Buffer == NULL) {
- StatusBarSetStatusString (L"Read Memory Failed");
- return EFI_OUT_OF_RESOURCES;
- }
- Status = HMemImage.IoFncs->Mem.Read (
- HMemImage.IoFncs,
- EfiCpuIoWidthUint8,
- Offset,
- Size,
- Buffer
- );
- if (EFI_ERROR (Status)) {
- FreePool (Buffer);
- StatusBarSetStatusString (L"Memory Specified Not Accessible");
- return EFI_LOAD_ERROR;
- }
- HBufferImageFree ();
- Status = HBufferImageBufferToList (Buffer, Size);
- FreePool (Buffer);
- if (EFI_ERROR (Status)) {
- StatusBarSetStatusString (L"Read Memory Failed");
- return Status;
- }
- Status = HMemImageSetMemOffsetSize (Offset, Size);
- HBufferImage.DisplayPosition.Row = 2;
- HBufferImage.DisplayPosition.Column = 10;
- HBufferImage.MousePosition.Row = 2;
- HBufferImage.MousePosition.Column = 10;
- HBufferImage.LowVisibleRow = 1;
- HBufferImage.HighBits = TRUE;
- HBufferImage.BufferPosition.Row = 1;
- HBufferImage.BufferPosition.Column = 1;
- if (!Recover) {
- Str = CatSPrint(NULL, L"%d Lines Read", HBufferImage.NumLines);
- if (Str == NULL) {
- StatusBarSetStatusString (L"Read Memory Failed");
- return EFI_OUT_OF_RESOURCES;
- }
- StatusBarSetStatusString (Str);
- SHELL_FREE_NON_NULL (Str);
- HMainEditor.SelectStart = 0;
- HMainEditor.SelectEnd = 0;
- }
- //
- // has line
- //
- if (HBufferImage.Lines != NULL) {
- HBufferImage.CurrentLine = CR (HBufferImage.ListHead->ForwardLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);
- } else {
- //
- // create a dummy line
- //
- Line = HBufferImageCreateLine ();
- if (Line == NULL) {
- StatusBarSetStatusString (L"Read Memory Failed");
- return EFI_OUT_OF_RESOURCES;
- }
- HBufferImage.CurrentLine = Line;
- }
- HBufferImage.Modified = FALSE;
- HBufferImageNeedRefresh = TRUE;
- HBufferImageOnlyLineNeedRefresh = FALSE;
- HBufferImageMouseNeedRefresh = TRUE;
- return EFI_SUCCESS;
- }
- /**
- Save lines in HBufferImage to disk.
- @param[in] Offset The offset.
- @param[in] Size The size.
- @retval EFI_LOAD_ERROR A load error occurred.
- @retval EFI_SUCCESS The operation was successful.
- @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
- **/
- EFI_STATUS
- HMemImageSave (
- IN UINTN Offset,
- IN UINTN Size
- )
- {
- EFI_STATUS Status;
- VOID *Buffer;
- //
- // not modified, so directly return
- //
- if (HBufferImage.Modified == FALSE) {
- return EFI_SUCCESS;
- }
- HBufferImage.BufferType = FileTypeMemBuffer;
- Buffer = AllocateZeroPool (Size);
- if (Buffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- Status = HBufferImageListToBuffer (Buffer, Size);
- if (EFI_ERROR (Status)) {
- FreePool (Buffer);
- return Status;
- }
- //
- // write back to memory
- //
- Status = HMemImage.IoFncs->Mem.Write (
- HMemImage.IoFncs,
- EfiCpuIoWidthUint8,
- Offset,
- Size,
- Buffer
- );
- FreePool (Buffer);
- if (EFI_ERROR (Status)) {
- return EFI_LOAD_ERROR;
- }
- //
- // now not modified
- //
- HBufferImage.Modified = FALSE;
- return EFI_SUCCESS;
- }
|