2 Functions to deal with Disk buffer.
4 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "HexEditor.h"
16 #include <Protocol/BlockIo.h>
18 extern EFI_HANDLE HImageHandleBackup
;
19 extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage
;
21 extern BOOLEAN HBufferImageNeedRefresh
;
22 extern BOOLEAN HBufferImageOnlyLineNeedRefresh
;
23 extern BOOLEAN HBufferImageMouseNeedRefresh
;
25 extern HEFI_EDITOR_GLOBAL_EDITOR HMainEditor
;
27 HEFI_EDITOR_DISK_IMAGE HDiskImage
;
28 HEFI_EDITOR_DISK_IMAGE HDiskImageBackupVar
;
31 // for basic initialization of HDiskImage
33 HEFI_EDITOR_DISK_IMAGE HDiskImageConst
= {
48 Initialization function for HDiskImage
62 // basically initialize the HDiskImage
64 CopyMem (&HDiskImage
, &HDiskImageConst
, sizeof (HDiskImage
));
66 CopyMem (&HDiskImageBackupVar
, &HDiskImageConst
, sizeof (HDiskImageBackupVar
));
79 Backup function for HDiskImage
80 Only a few fields need to be backup.
81 This is for making the Disk buffer refresh
91 EFI_OUT_OF_RESOURCES - gST->ConOut of resources
96 // backup the disk name, offset and size
99 SHELL_FREE_NON_NULL (HDiskImageBackupVar
.Name
);
101 HDiskImageBackupVar
.Name
= CatSPrint(NULL
, L
"%s", HDiskImage
.Name
);
102 if (HDiskImageBackupVar
.Name
== NULL
) {
103 return EFI_OUT_OF_RESOURCES
;
106 HDiskImageBackupVar
.Offset
= HDiskImage
.Offset
;
107 HDiskImageBackupVar
.Size
= HDiskImage
.Size
;
120 Cleanup function for HDiskImage
132 SHELL_FREE_NON_NULL (HDiskImage
.Name
);
133 SHELL_FREE_NON_NULL (HDiskImageBackupVar
.Name
);
140 HDiskImageSetDiskNameOffsetSize (
141 IN CONST CHAR16
*Str
,
149 Set FileName field in HFileImage
153 Str - File name to set
168 // free the old file name
170 SHELL_FREE_NON_NULL (HDiskImage
.Name
);
174 HDiskImage
.Name
= AllocateZeroPool (2 * (Len
+ 1));
175 if (HDiskImage
.Name
== NULL
) {
176 return EFI_OUT_OF_RESOURCES
;
179 for (Index
= 0; Index
< Len
; Index
++) {
180 HDiskImage
.Name
[Index
] = Str
[Index
];
183 HDiskImage
.Name
[Len
] = L
'\0';
185 HDiskImage
.Offset
= Offset
;
186 HDiskImage
.Size
= Size
;
193 IN CONST CHAR16
*DeviceName
,
202 Read a disk from disk into HBufferImage
206 DeviceName - filename to read
209 Recover - if is for recover, no information print
216 EFI_INVALID_PARAMETER
220 CONST EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
221 EFI_DEVICE_PATH_PROTOCOL
*DupDevicePath
;
223 EFI_BLOCK_IO_PROTOCOL
*BlkIo
;
230 HEFI_EDITOR_LINE
*Line
;
233 EDIT_FILE_TYPE BufferTypeBackup
;
235 BufferTypeBackup
= HBufferImage
.BufferType
;
236 HBufferImage
.BufferType
= FileTypeDiskBuffer
;
238 DevicePath
= gEfiShellProtocol
->GetDevicePathFromMap(DeviceName
);
239 if (DevicePath
== NULL
) {
240 StatusBarSetStatusString (L
"Cannot Find Device");
241 return EFI_INVALID_PARAMETER
;
243 DupDevicePath
= DuplicateDevicePath(DevicePath
);
245 // get blkio interface
247 Status
= gBS
->LocateDevicePath(&gEfiBlockIoProtocolGuid
,&DupDevicePath
,&Handle
);
248 FreePool(DupDevicePath
);
249 if (EFI_ERROR (Status
)) {
250 StatusBarSetStatusString (L
"Read Disk Failed");
253 Status
= gBS
->OpenProtocol(Handle
, &gEfiBlockIoProtocolGuid
, (VOID
**)&BlkIo
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
254 if (EFI_ERROR (Status
)) {
255 StatusBarSetStatusString (L
"Read Disk Failed");
259 // if Offset exceeds LastBlock,
262 if (Offset
> BlkIo
->Media
->LastBlock
|| Offset
+ Size
> BlkIo
->Media
->LastBlock
) {
263 StatusBarSetStatusString (L
"Invalid Offset + Size");
264 return EFI_LOAD_ERROR
;
267 Bytes
= BlkIo
->Media
->BlockSize
* Size
;
268 Buffer
= AllocateZeroPool (Bytes
);
270 if (Buffer
== NULL
) {
271 StatusBarSetStatusString (L
"Read Disk Failed");
272 return EFI_OUT_OF_RESOURCES
;
275 ByteOffset
= MultU64x32 (Offset
, BlkIo
->Media
->BlockSize
);
280 Status
= BlkIo
->ReadBlocks (
282 BlkIo
->Media
->MediaId
,
288 if (EFI_ERROR (Status
)) {
290 StatusBarSetStatusString (L
"Read Disk Failed");
291 return EFI_LOAD_ERROR
;
297 // convert buffer to line list
299 Status
= HBufferImageBufferToList (Buffer
, Bytes
);
302 if (EFI_ERROR (Status
)) {
303 StatusBarSetStatusString (L
"Read Disk Failed");
307 Status
= HDiskImageSetDiskNameOffsetSize (DeviceName
, Offset
, Size
);
308 if (EFI_ERROR (Status
)) {
309 StatusBarSetStatusString (L
"Read Disk Failed");
310 return EFI_OUT_OF_RESOURCES
;
313 // initialize some variables
315 HDiskImage
.BlockSize
= BlkIo
->Media
->BlockSize
;
317 HBufferImage
.DisplayPosition
.Row
= 2;
318 HBufferImage
.DisplayPosition
.Column
= 10;
320 HBufferImage
.MousePosition
.Row
= 2;
321 HBufferImage
.MousePosition
.Column
= 10;
323 HBufferImage
.LowVisibleRow
= 1;
324 HBufferImage
.HighBits
= TRUE
;
326 HBufferImage
.BufferPosition
.Row
= 1;
327 HBufferImage
.BufferPosition
.Column
= 1;
330 Str
= CatSPrint(NULL
, L
"%d Lines Read", HBufferImage
.NumLines
);
332 StatusBarSetStatusString (L
"Read Disk Failed");
333 return EFI_OUT_OF_RESOURCES
;
336 StatusBarSetStatusString (Str
);
337 SHELL_FREE_NON_NULL (Str
);
339 HMainEditor
.SelectStart
= 0;
340 HMainEditor
.SelectEnd
= 0;
347 if (HBufferImage
.Lines
!= NULL
) {
348 HBufferImage
.CurrentLine
= CR (
349 HBufferImage
.ListHead
->ForwardLink
,
356 // create a dummy line
358 Line
= HBufferImageCreateLine ();
360 StatusBarSetStatusString (L
"Read Disk Failed");
361 return EFI_OUT_OF_RESOURCES
;
364 HBufferImage
.CurrentLine
= Line
;
367 HBufferImage
.Modified
= FALSE
;
368 HBufferImageNeedRefresh
= TRUE
;
369 HBufferImageOnlyLineNeedRefresh
= FALSE
;
370 HBufferImageMouseNeedRefresh
= TRUE
;
377 IN CHAR16
*DeviceName
,
385 Save lines in HBufferImage to disk
386 NOT ALLOW TO WRITE TO ANOTHER DISK!!!!!!!!!
390 DeviceName - The device name
399 EFI_INVALID_PARAMETER
404 CONST EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
405 EFI_DEVICE_PATH_PROTOCOL
*DupDevicePath
;
406 EFI_BLOCK_IO_PROTOCOL
*BlkIo
;
414 EDIT_FILE_TYPE BufferTypeBackup
;
417 // if not modified, directly return
419 if (HBufferImage
.Modified
== FALSE
) {
423 BufferTypeBackup
= HBufferImage
.BufferType
;
424 HBufferImage
.BufferType
= FileTypeDiskBuffer
;
426 DevicePath
= gEfiShellProtocol
->GetDevicePathFromMap(DeviceName
);
427 if (DevicePath
== NULL
) {
428 // StatusBarSetStatusString (L"Cannot Find Device");
429 return EFI_INVALID_PARAMETER
;
431 DupDevicePath
= DuplicateDevicePath(DevicePath
);
434 // get blkio interface
436 Status
= gBS
->LocateDevicePath(&gEfiBlockIoProtocolGuid
,&DupDevicePath
,&Handle
);
437 FreePool(DupDevicePath
);
438 if (EFI_ERROR (Status
)) {
439 // StatusBarSetStatusString (L"Read Disk Failed");
442 Status
= gBS
->OpenProtocol(Handle
, &gEfiBlockIoProtocolGuid
, (VOID
**)&BlkIo
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
443 if (EFI_ERROR (Status
)) {
444 // StatusBarSetStatusString (L"Read Disk Failed");
448 Bytes
= BlkIo
->Media
->BlockSize
* Size
;
449 Buffer
= AllocateZeroPool (Bytes
);
451 if (Buffer
== NULL
) {
452 return EFI_OUT_OF_RESOURCES
;
455 // concatenate the line list to a buffer
457 Status
= HBufferImageListToBuffer (Buffer
, Bytes
);
458 if (EFI_ERROR (Status
)) {
463 ByteOffset
= MultU64x32 (Offset
, BlkIo
->Media
->BlockSize
);
466 // write the buffer to disk
468 Status
= BlkIo
->WriteBlocks (
470 BlkIo
->Media
->MediaId
,
478 if (EFI_ERROR (Status
)) {
479 return EFI_LOAD_ERROR
;
484 HBufferImage
.Modified
= FALSE
;