windows-nt/Source/XPSP1/NT/base/efiutil/sdk/shell/hexedit/libmemimage.c
2020-09-26 16:20:57 +08:00

229 lines
4.6 KiB
C

/*++
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