]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/MemImage.c
pointer verification (not NULL) and buffer overrun fixes.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / HexEdit / MemImage.c
CommitLineData
632820d1 1/** @file\r
2 Functions to deal with Mem buffer\r
3 \r
4 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "HexEditor.h"\r
16\r
17extern EFI_HANDLE HImageHandleBackup;\r
18\r
19extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage;\r
20\r
21extern BOOLEAN HBufferImageNeedRefresh;\r
22extern BOOLEAN HBufferImageOnlyLineNeedRefresh;\r
23extern BOOLEAN HBufferImageMouseNeedRefresh;\r
24\r
25extern HEFI_EDITOR_GLOBAL_EDITOR HMainEditor;\r
26\r
27HEFI_EDITOR_MEM_IMAGE HMemImage;\r
28HEFI_EDITOR_MEM_IMAGE HMemImageBackupVar;\r
29\r
30EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL DummyPciRootBridgeIo;\r
31\r
32//\r
33// for basic initialization of HDiskImage\r
34//\r
35HEFI_EDITOR_MEM_IMAGE HMemImageConst = {\r
36 NULL,\r
37 0,\r
38 0\r
39};\r
40\r
41EFI_STATUS\r
42DummyMemRead (\r
43 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * This,\r
44 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
45 IN UINT64 Address,\r
46 IN UINTN Count,\r
47 IN OUT VOID *Buffer\r
48 );\r
49\r
50EFI_STATUS\r
51DummyMemWrite (\r
52 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * This,\r
53 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
54 IN UINT64 Address,\r
55 IN UINTN Count,\r
56 IN OUT VOID *Buffer\r
57 );\r
58\r
59EFI_STATUS\r
60HMemImageInit (\r
61 VOID\r
62 )\r
63/*++\r
64\r
65Routine Description: \r
66\r
67 Initialization function for HDiskImage\r
68\r
69Arguments: \r
70\r
71 None\r
72\r
73Returns: \r
74\r
75 EFI_SUCCESS\r
76 EFI_LOAD_ERROR\r
77\r
78--*/\r
79{\r
80 EFI_STATUS Status;\r
81\r
82 //\r
83 // basically initialize the HMemImage\r
84 //\r
85 CopyMem (&HMemImage, &HMemImageConst, sizeof (HMemImage));\r
86\r
87 Status = gBS->LocateProtocol (\r
88 &gEfiPciRootBridgeIoProtocolGuid,\r
89 NULL,\r
90 (VOID**)&HMemImage.IoFncs\r
91 );\r
92 if (Status == EFI_NOT_FOUND) {\r
93 //\r
94 // For NT32, no EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL is available\r
95 // Use Dummy PciRootBridgeIo for memory access\r
96 //\r
97 ZeroMem (&DummyPciRootBridgeIo, sizeof (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL));\r
98 DummyPciRootBridgeIo.Mem.Read = DummyMemRead;\r
99 DummyPciRootBridgeIo.Mem.Write = DummyMemWrite;\r
100 HMemImage.IoFncs = &DummyPciRootBridgeIo;\r
101 Status = EFI_SUCCESS;\r
102 }\r
103 if (!EFI_ERROR (Status)) {\r
104 return EFI_SUCCESS;\r
105 } else {\r
106 return EFI_LOAD_ERROR;\r
107 }\r
108}\r
109\r
110EFI_STATUS\r
111HMemImageBackup (\r
112 VOID\r
113 )\r
114/*++\r
115\r
116Routine Description: \r
117\r
118 Backup function for HDiskImage\r
119 Only a few fields need to be backup. \r
120 This is for making the Disk buffer refresh \r
121 as few as possible.\r
122\r
123Arguments: \r
124\r
125 None\r
126\r
127Returns: \r
128\r
129 EFI_SUCCESS\r
130\r
131--*/\r
132{\r
133 HMemImageBackupVar.Offset = HMemImage.Offset;\r
134 HMemImageBackupVar.Size = HMemImage.Size;\r
135\r
136 return EFI_SUCCESS;\r
137}\r
138\r
139EFI_STATUS\r
140HMemImageCleanup (\r
141 VOID\r
142 )\r
143/*++\r
144\r
145Routine Description: \r
146\r
147 Cleanup function for HDiskImage\r
148\r
149Arguments: \r
150\r
151 None\r
152\r
153Returns: \r
154\r
155 EFI_SUCCESS\r
156\r
157--*/\r
158{\r
159 return EFI_SUCCESS;\r
160}\r
161\r
162EFI_STATUS\r
163HMemImageSetMemOffsetSize (\r
164 IN UINTN Offset,\r
165 IN UINTN Size\r
166 )\r
167/*++\r
168\r
169Routine Description: \r
170\r
171 Set FileName field in HFileImage\r
172\r
173Arguments: \r
174\r
175 Offset - The offset\r
176 Size - The size\r
177\r
178Returns: \r
179\r
180 EFI_SUCCESS\r
181 EFI_OUT_OF_RESOURCES\r
182\r
183--*/\r
184{\r
185\r
186 HMemImage.Offset = Offset;\r
187 HMemImage.Size = Size;\r
188\r
189 return EFI_SUCCESS;\r
190}\r
191\r
192EFI_STATUS\r
193HMemImageRead (\r
194 IN UINTN Offset,\r
195 IN UINTN Size,\r
196 BOOLEAN Recover\r
197 )\r
198/*++\r
199\r
200Routine Description: \r
201\r
202 Read a disk from disk into HBufferImage\r
203\r
204Arguments: \r
205\r
206 Offset - The offset\r
207 Size - The size\r
208 Recover - if is for recover, no information print\r
209\r
210Returns: \r
211\r
212 EFI_SUCCESS\r
213 EFI_LOAD_ERROR\r
214 EFI_OUT_OF_RESOURCES\r
215 \r
216--*/\r
217{\r
218\r
219 EFI_STATUS Status;\r
220 void *Buffer;\r
221 CHAR16 *Str;\r
222 HEFI_EDITOR_LINE *Line;\r
223\r
224 EDIT_FILE_TYPE BufferTypeBackup;\r
225\r
226 BufferTypeBackup = HBufferImage.BufferType;\r
227 HBufferImage.BufferType = FileTypeMemBuffer;\r
228\r
229 Buffer = AllocateZeroPool (Size);\r
230 if (Buffer == NULL) {\r
231 StatusBarSetStatusString (L"Read Memory Failed");\r
232 return EFI_OUT_OF_RESOURCES;\r
233 }\r
234\r
235 Status = HMemImage.IoFncs->Mem.Read (\r
236 HMemImage.IoFncs,\r
237 EfiPciWidthUint8,\r
238 Offset,\r
239 Size,\r
240 Buffer\r
241 );\r
242\r
243 if (EFI_ERROR (Status)) {\r
244 FreePool (Buffer);\r
245 StatusBarSetStatusString (L"Memory Specified Not Accessible");\r
246 return EFI_LOAD_ERROR;\r
247 }\r
248\r
249 HBufferImageFree ();\r
250\r
251 Status = HBufferImageBufferToList (Buffer, Size);\r
252 FreePool (Buffer);\r
253\r
254 if (EFI_ERROR (Status)) {\r
255 StatusBarSetStatusString (L"Read Memory Failed");\r
256 return Status;\r
257 }\r
258\r
259 Status = HMemImageSetMemOffsetSize (Offset, Size);\r
260\r
261 HBufferImage.DisplayPosition.Row = 2;\r
262 HBufferImage.DisplayPosition.Column = 10;\r
263\r
264 HBufferImage.MousePosition.Row = 2;\r
265 HBufferImage.MousePosition.Column = 10;\r
266\r
267 HBufferImage.LowVisibleRow = 1;\r
268 HBufferImage.HighBits = TRUE;\r
269\r
270 HBufferImage.BufferPosition.Row = 1;\r
271 HBufferImage.BufferPosition.Column = 1;\r
272\r
273 if (!Recover) {\r
274 Str = CatSPrint(NULL, L"%d Lines Read", HBufferImage.NumLines);\r
275 if (Str == NULL) {\r
276 StatusBarSetStatusString (L"Read Memory Failed");\r
277 return EFI_OUT_OF_RESOURCES;\r
278 }\r
279\r
280 StatusBarSetStatusString (Str);\r
281 SHELL_FREE_NON_NULL (Str);\r
282\r
283 HMainEditor.SelectStart = 0;\r
284 HMainEditor.SelectEnd = 0;\r
285\r
286 }\r
287\r
288 //\r
289 // has line\r
290 //\r
291 if (HBufferImage.Lines != NULL) {\r
292 HBufferImage.CurrentLine = CR (HBufferImage.ListHead->ForwardLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
293 } else {\r
294 //\r
295 // create a dummy line\r
296 //\r
297 Line = HBufferImageCreateLine ();\r
298 if (Line == NULL) {\r
299 StatusBarSetStatusString (L"Read Memory Failed");\r
300 return EFI_OUT_OF_RESOURCES;\r
301 }\r
302\r
303 HBufferImage.CurrentLine = Line;\r
304 }\r
305\r
306 HBufferImage.Modified = FALSE;\r
307 HBufferImageNeedRefresh = TRUE;\r
308 HBufferImageOnlyLineNeedRefresh = FALSE;\r
309 HBufferImageMouseNeedRefresh = TRUE;\r
310\r
311 return EFI_SUCCESS;\r
312\r
313}\r
314\r
315EFI_STATUS\r
316HMemImageSave (\r
317 IN UINTN Offset,\r
318 IN UINTN Size\r
319 )\r
320/*++\r
321\r
322Routine Description: \r
323\r
324 Save lines in HBufferImage to disk\r
325\r
326Arguments: \r
327\r
328 Offset - The offset\r
329 Size - The size\r
330\r
331Returns: \r
332\r
333 EFI_SUCCESS\r
334 EFI_LOAD_ERROR\r
335 EFI_OUT_OF_RESOURCES\r
336\r
337--*/\r
338{\r
339\r
340 EFI_STATUS Status;\r
341 VOID *Buffer;\r
342\r
343 EDIT_FILE_TYPE BufferTypeBackup;\r
344\r
345 //\r
346 // not modified, so directly return\r
347 //\r
348 if (HBufferImage.Modified == FALSE) {\r
349 return EFI_SUCCESS;\r
350 }\r
351\r
352 BufferTypeBackup = HBufferImage.BufferType;\r
353 HBufferImage.BufferType = FileTypeMemBuffer;\r
354\r
355 Buffer = AllocateZeroPool (Size);\r
356\r
357 if (Buffer == NULL) {\r
358 return EFI_OUT_OF_RESOURCES;\r
359 }\r
360\r
361 Status = HBufferImageListToBuffer (Buffer, Size);\r
362 if (EFI_ERROR (Status)) {\r
363 FreePool (Buffer);\r
364 return Status;\r
365 }\r
366 //\r
367 // write back to memory\r
368 //\r
369 Status = HMemImage.IoFncs->Mem.Write (\r
370 HMemImage.IoFncs,\r
371 EfiPciWidthUint8,\r
372 Offset,\r
373 Size,\r
374 Buffer\r
375 );\r
376\r
377 FreePool (Buffer);\r
378\r
379 if (EFI_ERROR (Status)) {\r
380 return EFI_LOAD_ERROR;\r
381 }\r
382 //\r
383 // now not modified\r
384 //\r
385 HBufferImage.Modified = FALSE;\r
386\r
387 return EFI_SUCCESS;\r
388}\r
389\r
390EFI_STATUS\r
391DummyMemRead (\r
392 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * This,\r
393 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
394 IN UINT64 Address,\r
395 IN UINTN Count,\r
396 IN OUT VOID *Buffer\r
397 )\r
398{\r
399 return EFI_UNSUPPORTED;\r
400}\r
401\r
402EFI_STATUS\r
403DummyMemWrite (\r
404 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * This,\r
405 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
406 IN UINT64 Address,\r
407 IN UINTN Count,\r
408 IN OUT VOID *Buffer\r
409 )\r
410{\r
411 return EFI_UNSUPPORTED;\r
412}\r