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