|
|
/*++
Copyright (c) 1999 Intel Corporation
Module Name: libMemImage.c
Abstract: Defines the routines for handling a memory buffer
--*/
#ifndef _LIB_MEM_IMAGE
#define _LIB_MEM_IMAGE
#include "libMisc.h"
STATIC EFI_STATUS MemImageInit (VOID); STATIC EFI_STATUS MemImageOpen (VOID); STATIC EFI_STATUS MemImageClose (VOID); STATIC EFI_STATUS MemImageCleanup (VOID); STATIC EFI_STATUS MemImageRead (VOID); STATIC EFI_STATUS MemImageWrite (VOID); STATIC EFI_STATUS MemImageSetOffset (UINTN); STATIC EFI_STATUS MemImageSetSize (UINTN);
extern EE_BUFFER_IMAGE BufferImage;
EE_MEM_IMAGE MemImage = { NULL, 0, 0, MemImageInit, MemImageSetOffset, MemImageSetSize, };
STATIC EFI_STATUS MemImageInit ( VOID ) { BufferImage.ImageCleanup();
MemImage.IoFncs = AllocatePool(sizeof(EFI_DEVICE_IO_INTERFACE));
BufferImage.ImageCleanup = MemImageCleanup; BufferImage.Open = MemImageOpen; BufferImage.Close = MemImageClose; BufferImage.Read = MemImageRead; BufferImage.Write = MemImageWrite; BufferImage.BufferType = MEM_BUFFER;
return EFI_SUCCESS; }
STATIC EFI_STATUS MemImageOpen ( VOID ) { EFI_STATUS Status; EFI_HANDLE Handle; EFI_DEVICE_PATH *DevicePath; EFI_DEV_PATH Node;
ZeroMem(&Node,sizeof(Node)); Node.DevPath.Type = HARDWARE_DEVICE_PATH; Node.DevPath.SubType = HW_MEMMAP_DP; SetDevicePathNodeLength(&Node.DevPath,sizeof(MEMMAP_DEVICE_PATH));
Node.MemMap.StartingAddress = MemImage.Offset; Node.MemMap.EndingAddress = MemImage.Offset + MemImage.Size;
DevicePath = AppendDevicePathNode (EndDevicePath, &Node.DevPath);
Status = BS->LocateDevicePath(&DevicePathProtocol, &DevicePath, &Handle ); if (EFI_ERROR(Status)) { EditorError(Status,L"MemImageOpen: Could not get DevicePath"); return Status; }
Status = BS->HandleProtocol (Handle, &DeviceIoProtocol, &MemImage.IoFncs ); if (EFI_ERROR(Status)) { EditorError(Status,L"MemImageOpen: Could not get DeviceIo Protocol"); return Status; }
return EFI_SUCCESS; }
STATIC EFI_STATUS MemImageClose ( VOID ) { LineDeleteAll(BufferImage.ListHead); BufferImage.NumBytes = 0;
MainEditor.FileBuffer->Offset = 0x00; MainEditor.StatusBar->SetOffset(0x00); MainEditor.FileBuffer->LowVisibleOffset = 0x00;
MainEditor.FileBuffer->SetPosition(DISP_START_ROW,HEX_POSITION);
MainEditor.FileModified = FALSE;
return EFI_SUCCESS; }
STATIC EFI_STATUS MemImageCleanup ( VOID ) { if (MemImage.IoFncs != NULL) { FreePool(MemImage.IoFncs); }
MemImage.Offset = 0; MemImage.Size = 0;
BufferImage.ImageCleanup = Nothing; BufferImage.Open = Nothing; BufferImage.Close = Nothing; BufferImage.Read = Nothing; BufferImage.Write = Nothing;
return EFI_SUCCESS; }
STATIC EFI_STATUS MemImageRead ( VOID ) { EFI_STATUS Status; VOID *Buffer;
Buffer = AllocatePool(MemImage.Size);
Status = MemImage.IoFncs->Mem.Read ( MemImage.IoFncs, IO_UINT8, MemImage.Offset, MemImage.Size, Buffer );
if (EFI_ERROR(Status)) { EditorError(Status,L"MemImageRead: Trouble Reading Memory"); return Status; }
BufferToList(BufferImage.ListHead,MemImage.Size,Buffer);
FreePool(Buffer);
return EFI_SUCCESS; }
STATIC EFI_STATUS MemImageWrite ( VOID ) { EFI_STATUS Status; VOID *Buffer;
MemImage.Size = MainEditor.BufferImage->NumBytes; Buffer = AllocatePool(MemImage.Size);
/*
* Construct the buffer from the list of lines */
Status = MemImage.IoFncs->Mem.Write ( MemImage.IoFncs, IO_UINT8, MemImage.Offset, MemImage.Size, Buffer );
if (EFI_ERROR(Status)) { EditorError(Status,L"Trouble Writing Memory"); }
FreePool(Buffer);
return Status; }
STATIC EFI_STATUS MemImageSetOffset ( IN UINTN Offset ) { MemImage.Offset = Offset; return EFI_SUCCESS; }
STATIC EFI_STATUS MemImageSetSize ( IN UINTN Size ) { MemImage.Size = Size; return EFI_SUCCESS; }
#endif _LIB_MEM_IMAGE
|