mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
4.7 KiB
245 lines
4.7 KiB
/*++
|
|
|
|
Copyright (c) 1999 Intel Corporation
|
|
|
|
Module Name:
|
|
libDiskImage.c
|
|
|
|
Abstract:
|
|
Describes the routines for handling and editing a disk buffer in memory
|
|
|
|
--*/
|
|
|
|
#ifndef _LIB_DISK_IMAGE
|
|
#define _LIB_DISK_IMAGE
|
|
|
|
#include "libMisc.h"
|
|
|
|
extern EE_BUFFER_IMAGE BufferImage;
|
|
|
|
STATIC EFI_STATUS DiskImageInit (VOID);
|
|
STATIC EFI_STATUS DiskImageCleanup (VOID);
|
|
STATIC EFI_STATUS DiskImageOpen (VOID);
|
|
STATIC EFI_STATUS DiskImageClose (VOID);
|
|
STATIC EFI_STATUS DiskImageRead (VOID);
|
|
STATIC EFI_STATUS DiskImageWrite (VOID);
|
|
STATIC EFI_STATUS DiskImageSetSize (UINTN);
|
|
STATIC EFI_STATUS DiskImageSetOffset (UINT64);
|
|
|
|
STATIC EFI_STATUS DiskImageSetDevice (CHAR16*);
|
|
|
|
EE_DISK_IMAGE DiskImage = {
|
|
NULL,
|
|
NULL,
|
|
0,
|
|
0,
|
|
DiskImageInit,
|
|
DiskImageSetDevice,
|
|
DiskImageSetOffset,
|
|
DiskImageSetSize
|
|
};
|
|
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
DiskImageInit (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_HANDLE *HandleBuffer = NULL;
|
|
|
|
BufferImage.ImageCleanup();
|
|
|
|
BufferImage.ImageCleanup = DiskImageCleanup;
|
|
BufferImage.Open = DiskImageOpen;
|
|
BufferImage.Close = DiskImageClose;
|
|
BufferImage.Read = DiskImageRead;
|
|
BufferImage.Write = DiskImageWrite;
|
|
BufferImage.BufferType = DISK_BUFFER;
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
DiskImageSetDevice (
|
|
IN CHAR16* Device
|
|
)
|
|
{
|
|
DiskImage.DevicePath = (EFI_DEVICE_PATH *)ShellGetMap (Device);
|
|
if (DiskImage.DevicePath == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
DiskImageSetOffset (
|
|
IN UINT64 Offset
|
|
)
|
|
{
|
|
DiskImage.Offset = Offset;
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
DiskImageSetSize (
|
|
IN UINTN Size
|
|
)
|
|
{
|
|
DiskImage.Size = Size;
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
DiskImageCleanup (
|
|
VOID
|
|
)
|
|
{
|
|
DiskImage.Offset = 0;
|
|
DiskImage.Size = 0;
|
|
DiskImage.DevicePath = NULL;
|
|
|
|
BufferImage.ImageCleanup = Nothing;
|
|
BufferImage.Open = Nothing;
|
|
BufferImage.Close = Nothing;
|
|
BufferImage.Read = Nothing;
|
|
BufferImage.Write = Nothing;
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
DiskImageOpen (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
|
|
if (DiskImage.DevicePath == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
Status = LibDevicePathToInterface (&BlockIoProtocol, DiskImage.DevicePath, &DiskImage.BlkIo);
|
|
if (EFI_ERROR(Status)) {
|
|
EditorError(Status,L"Device Not a BlockIo Device");
|
|
return Status;
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
DiskImageRead (
|
|
VOID
|
|
)
|
|
{
|
|
VOID *Buffer;
|
|
CHAR16 *Str;
|
|
EFI_BLOCK_IO *BlockIo = DiskImage.BlkIo;
|
|
UINTN Bytes;
|
|
EFI_STATUS Status;
|
|
|
|
|
|
if (DiskImage.Offset > MultU64x32 (BlockIo->Media->LastBlock, BlockIo->Media->BlockSize)) {
|
|
DiskImage.Offset = 0;
|
|
}
|
|
|
|
Bytes = BlockIo->Media->BlockSize*DiskImage.Size;
|
|
Buffer = AllocatePool (Bytes);
|
|
|
|
if (Buffer == NULL) {
|
|
EditorError(EFI_OUT_OF_RESOURCES,L"DiskImageRead: Could not allocate memory for buffer");
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
|
|
Status = BlockIo->ReadBlocks (
|
|
BlockIo,
|
|
BlockIo->Media->MediaId,
|
|
DiskImage.Offset,
|
|
Bytes,
|
|
Buffer
|
|
);
|
|
|
|
if (EFI_ERROR(Status)) {
|
|
EditorError(Status,L"DiskImageRead: Error in reading");
|
|
} else {
|
|
BufferToList(BufferImage.ListHead,Bytes,Buffer);
|
|
}
|
|
|
|
FreePool(Buffer);
|
|
|
|
Str = PoolPrint(L"%d Bytes Read",Bytes);
|
|
MainEditor.StatusBar->SetStatusString(Str);
|
|
FreePool (Str);
|
|
|
|
return Status;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
DiskImageClose (
|
|
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
|
|
DiskImageWrite (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
VOID *Buffer;
|
|
UINTN Bytes;
|
|
|
|
|
|
DiskImage.Size = MainEditor.BufferImage->NumBytes;
|
|
|
|
Bytes = DiskImage.BlkIo->Media->BlockSize*DiskImage.Size;
|
|
Buffer = AllocatePool (Bytes);
|
|
|
|
if (Buffer == NULL) {
|
|
EditorError(EFI_OUT_OF_RESOURCES,L"DiskImageWrite: Could not allocate memory for buffer");
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
|
|
/*
|
|
* Convert from list to buffer
|
|
*/
|
|
|
|
Status = DiskImage.BlkIo->WriteBlocks(DiskImage.BlkIo, DiskImage.BlkIo->Media->MediaId, DiskImage.Offset, Bytes, Buffer);
|
|
|
|
if (EFI_ERROR(Status)) {
|
|
EditorError(Status,L"DiskImageWrite: Error in writing");
|
|
}
|
|
|
|
FreePool(Buffer);
|
|
return Status;
|
|
}
|
|
|
|
|
|
|
|
#endif /* _LIB_DISK_IMAGE */
|