MemImage.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /** @file
  2. Functions to deal with Mem buffer
  3. Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include "HexEditor.h"
  7. extern EFI_HANDLE HImageHandleBackup;
  8. extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage;
  9. extern BOOLEAN HBufferImageNeedRefresh;
  10. extern BOOLEAN HBufferImageOnlyLineNeedRefresh;
  11. extern BOOLEAN HBufferImageMouseNeedRefresh;
  12. extern HEFI_EDITOR_GLOBAL_EDITOR HMainEditor;
  13. HEFI_EDITOR_MEM_IMAGE HMemImage;
  14. HEFI_EDITOR_MEM_IMAGE HMemImageBackupVar;
  15. //
  16. // for basic initialization of HDiskImage
  17. //
  18. HEFI_EDITOR_MEM_IMAGE HMemImageConst = {
  19. NULL,
  20. 0,
  21. 0
  22. };
  23. /**
  24. Initialization function for HDiskImage.
  25. @retval EFI_SUCCESS The operation was successful.
  26. @retval EFI_LOAD_ERROR A load error occurred.
  27. **/
  28. EFI_STATUS
  29. HMemImageInit (
  30. VOID
  31. )
  32. {
  33. EFI_STATUS Status;
  34. //
  35. // basically initialize the HMemImage
  36. //
  37. CopyMem (&HMemImage, &HMemImageConst, sizeof (HMemImage));
  38. Status = gBS->LocateProtocol (
  39. &gEfiCpuIo2ProtocolGuid,
  40. NULL,
  41. (VOID**)&HMemImage.IoFncs
  42. );
  43. if (!EFI_ERROR (Status)) {
  44. return EFI_SUCCESS;
  45. } else {
  46. return EFI_LOAD_ERROR;
  47. }
  48. }
  49. /**
  50. Backup function for HDiskImage. Only a few fields need to be backup.
  51. This is for making the Disk buffer refresh as few as possible.
  52. @retval EFI_SUCCESS The operation was successful.
  53. **/
  54. EFI_STATUS
  55. HMemImageBackup (
  56. VOID
  57. )
  58. {
  59. HMemImageBackupVar.Offset = HMemImage.Offset;
  60. HMemImageBackupVar.Size = HMemImage.Size;
  61. return EFI_SUCCESS;
  62. }
  63. /**
  64. Set FileName field in HFileImage.
  65. @param[in] Offset The offset.
  66. @param[in] Size The size.
  67. @retval EFI_SUCCESS The operation was successful.
  68. @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
  69. **/
  70. EFI_STATUS
  71. HMemImageSetMemOffsetSize (
  72. IN UINTN Offset,
  73. IN UINTN Size
  74. )
  75. {
  76. HMemImage.Offset = Offset;
  77. HMemImage.Size = Size;
  78. return EFI_SUCCESS;
  79. }
  80. /**
  81. Read a disk from disk into HBufferImage.
  82. @param[in] Offset The offset.
  83. @param[in] Size The size.
  84. @param[in] Recover if is for recover, no information print.
  85. @retval EFI_LOAD_ERROR A load error occurred.
  86. @retval EFI_SUCCESS The operation was successful.
  87. @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
  88. **/
  89. EFI_STATUS
  90. HMemImageRead (
  91. IN UINTN Offset,
  92. IN UINTN Size,
  93. IN BOOLEAN Recover
  94. )
  95. {
  96. EFI_STATUS Status;
  97. void *Buffer;
  98. CHAR16 *Str;
  99. HEFI_EDITOR_LINE *Line;
  100. HBufferImage.BufferType = FileTypeMemBuffer;
  101. Buffer = AllocateZeroPool (Size);
  102. if (Buffer == NULL) {
  103. StatusBarSetStatusString (L"Read Memory Failed");
  104. return EFI_OUT_OF_RESOURCES;
  105. }
  106. Status = HMemImage.IoFncs->Mem.Read (
  107. HMemImage.IoFncs,
  108. EfiCpuIoWidthUint8,
  109. Offset,
  110. Size,
  111. Buffer
  112. );
  113. if (EFI_ERROR (Status)) {
  114. FreePool (Buffer);
  115. StatusBarSetStatusString (L"Memory Specified Not Accessible");
  116. return EFI_LOAD_ERROR;
  117. }
  118. HBufferImageFree ();
  119. Status = HBufferImageBufferToList (Buffer, Size);
  120. FreePool (Buffer);
  121. if (EFI_ERROR (Status)) {
  122. StatusBarSetStatusString (L"Read Memory Failed");
  123. return Status;
  124. }
  125. Status = HMemImageSetMemOffsetSize (Offset, Size);
  126. HBufferImage.DisplayPosition.Row = 2;
  127. HBufferImage.DisplayPosition.Column = 10;
  128. HBufferImage.MousePosition.Row = 2;
  129. HBufferImage.MousePosition.Column = 10;
  130. HBufferImage.LowVisibleRow = 1;
  131. HBufferImage.HighBits = TRUE;
  132. HBufferImage.BufferPosition.Row = 1;
  133. HBufferImage.BufferPosition.Column = 1;
  134. if (!Recover) {
  135. Str = CatSPrint(NULL, L"%d Lines Read", HBufferImage.NumLines);
  136. if (Str == NULL) {
  137. StatusBarSetStatusString (L"Read Memory Failed");
  138. return EFI_OUT_OF_RESOURCES;
  139. }
  140. StatusBarSetStatusString (Str);
  141. SHELL_FREE_NON_NULL (Str);
  142. HMainEditor.SelectStart = 0;
  143. HMainEditor.SelectEnd = 0;
  144. }
  145. //
  146. // has line
  147. //
  148. if (HBufferImage.Lines != NULL) {
  149. HBufferImage.CurrentLine = CR (HBufferImage.ListHead->ForwardLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);
  150. } else {
  151. //
  152. // create a dummy line
  153. //
  154. Line = HBufferImageCreateLine ();
  155. if (Line == NULL) {
  156. StatusBarSetStatusString (L"Read Memory Failed");
  157. return EFI_OUT_OF_RESOURCES;
  158. }
  159. HBufferImage.CurrentLine = Line;
  160. }
  161. HBufferImage.Modified = FALSE;
  162. HBufferImageNeedRefresh = TRUE;
  163. HBufferImageOnlyLineNeedRefresh = FALSE;
  164. HBufferImageMouseNeedRefresh = TRUE;
  165. return EFI_SUCCESS;
  166. }
  167. /**
  168. Save lines in HBufferImage to disk.
  169. @param[in] Offset The offset.
  170. @param[in] Size The size.
  171. @retval EFI_LOAD_ERROR A load error occurred.
  172. @retval EFI_SUCCESS The operation was successful.
  173. @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
  174. **/
  175. EFI_STATUS
  176. HMemImageSave (
  177. IN UINTN Offset,
  178. IN UINTN Size
  179. )
  180. {
  181. EFI_STATUS Status;
  182. VOID *Buffer;
  183. //
  184. // not modified, so directly return
  185. //
  186. if (HBufferImage.Modified == FALSE) {
  187. return EFI_SUCCESS;
  188. }
  189. HBufferImage.BufferType = FileTypeMemBuffer;
  190. Buffer = AllocateZeroPool (Size);
  191. if (Buffer == NULL) {
  192. return EFI_OUT_OF_RESOURCES;
  193. }
  194. Status = HBufferImageListToBuffer (Buffer, Size);
  195. if (EFI_ERROR (Status)) {
  196. FreePool (Buffer);
  197. return Status;
  198. }
  199. //
  200. // write back to memory
  201. //
  202. Status = HMemImage.IoFncs->Mem.Write (
  203. HMemImage.IoFncs,
  204. EfiCpuIoWidthUint8,
  205. Offset,
  206. Size,
  207. Buffer
  208. );
  209. FreePool (Buffer);
  210. if (EFI_ERROR (Status)) {
  211. return EFI_LOAD_ERROR;
  212. }
  213. //
  214. // now not modified
  215. //
  216. HBufferImage.Modified = FALSE;
  217. return EFI_SUCCESS;
  218. }