15 |
{ |
{ |
16 |
public partial class UIMemoryViewer : UserControl, IProcessConfig, IAcceptsPlugin<IConfigPlugin>//, IAcceptsMemoryRange |
public partial class UIMemoryViewer : UserControl, IProcessConfig, IAcceptsPlugin<IConfigPlugin>//, IAcceptsMemoryRange |
17 |
{ |
{ |
18 |
|
private bool first_load = true; |
19 |
public UIMemoryViewer() |
public UIMemoryViewer() |
20 |
{ |
{ |
21 |
InitializeComponent(); |
InitializeComponent(); |
30 |
txtData.UseFixedBytesPerLine = true; |
txtData.UseFixedBytesPerLine = true; |
31 |
txtData.StringViewVisible = true; |
txtData.StringViewVisible = true; |
32 |
ramScroll.Minimum = (int)MemoryStart; |
ramScroll.Minimum = (int)MemoryStart; |
33 |
for (uint i = MemoryStart; i < (MemoryStart + MemorySize); i += max_address_width) { ramScroll.Maximum += (int)max_address_width; } |
for (uint i = MemoryStart; i < (MemoryStart + max_ram_view); i += max_address_width) { ramScroll.Maximum += (int)max_address_width; } |
34 |
ramScroll.Value = ramScroll.Minimum; |
ramScroll.Value = ramScroll.Minimum; |
35 |
this.CanChangeUpdateInterval = false; |
this.CanChangeUpdateInterval = false; |
36 |
|
|
41 |
lblAddressMarker.Text = lblAddressMarker.Text + string.Format("{0:X2} ", i); |
lblAddressMarker.Text = lblAddressMarker.Text + string.Format("{0:X2} ", i); |
42 |
} |
} |
43 |
this.AcceptedPlugin = null; this.AcceptedProcess = null; |
this.AcceptedPlugin = null; this.AcceptedProcess = null; |
44 |
|
|
45 |
|
txtAddresses.MouseWheel += new MouseEventHandler(txtAddresses_MouseWheel); |
46 |
|
txtData.MouseWheel += new MouseEventHandler(txtData_MouseWheel); |
47 |
|
} |
48 |
|
|
49 |
|
private void GetFirstNonZeroByte() |
50 |
|
{ |
51 |
|
if (!DesignMode) |
52 |
|
{ |
53 |
|
Sojaner.MemoryScanner.ProcessMemoryReader reader = new Sojaner.MemoryScanner.ProcessMemoryReader(); |
54 |
|
reader.ReadProcess = this.AcceptedProcess; |
55 |
|
reader.OpenProcess(); |
56 |
|
uint addr = 0; |
57 |
|
reader.ReadFirstNonZeroByte(MemoryStart, MemorySize, out addr); |
58 |
|
GotoAddress(addr); |
59 |
|
} |
60 |
} |
} |
61 |
|
|
62 |
#region IProcessConfig Members |
#region IProcessConfig Members |
63 |
private Process _AcceptedProcess; |
private Process _AcceptedProcess; |
64 |
public Process AcceptedProcess |
public Process AcceptedProcess |
69 |
_AcceptedProcess = value; |
_AcceptedProcess = value; |
70 |
update_timer.Enabled = (value != null); |
update_timer.Enabled = (value != null); |
71 |
UpdateEnabled = update_timer.Enabled; |
UpdateEnabled = update_timer.Enabled; |
72 |
|
if (value != null) |
73 |
|
GetFirstNonZeroByte(); |
74 |
} |
} |
75 |
} |
} |
76 |
#endregion |
#endregion |
78 |
public IConfigPlugin AcceptedPlugin { get; set; } |
public IConfigPlugin AcceptedPlugin { get; set; } |
79 |
#endregion |
#endregion |
80 |
#region IAcceptsMemoryRange members |
#region IAcceptsMemoryRange members |
81 |
public uint MemoryStart { get; set; } |
private uint MemoryStart { get { return 0; } } |
82 |
public uint MemorySize { get; set; } |
private uint MemorySize { get { return int.MaxValue; } } |
83 |
#endregion |
#endregion |
84 |
public void GotoTop() { this.CURRENT_TOP_ADDR = 0; } |
public void GotoTop() { this.CURRENT_TOP_ADDR = 0; } |
85 |
public void GotoBottom() { uint size = MemorySize; this.CURRENT_TOP_ADDR = (uint)((size - 1) - max_ram_view); } |
public void GotoBottom() { uint size = MemorySize; this.CURRENT_TOP_ADDR = (uint)((size - 1) - max_ram_view); } |
216 |
if (AcceptedPlugin == null) { return; } |
if (AcceptedPlugin == null) { return; } |
217 |
|
|
218 |
byte[] data = GetMemory(); |
byte[] data = GetMemory(); |
|
|
|
|
List<byte> ByteData = new List<byte>((int)(address + (max_ram_view - 0))); |
|
|
|
|
219 |
try |
try |
220 |
{ |
{ |
221 |
AddressList = ""; |
RamData = data; |
|
AsciiData = ""; |
|
222 |
|
|
|
// create a byte array holding only the bytes that we need |
|
|
for (uint i = address; i < (address + (max_ram_view + 1)); i += 1) { ByteData.Add(data[i]); } |
|
223 |
|
|
224 |
|
AddressList = ""; |
225 |
|
AsciiData = ""; |
226 |
// write the addreses out |
// write the addreses out |
227 |
for (uint i = address; i < (address + max_ram_view); i += max_address_width) |
for (uint i = address; i < (address + max_ram_view); i += max_address_width) |
228 |
{ |
{ |
229 |
AddressList = AddressList + string.Format("{0:X8}:\n", i); |
AddressList = AddressList + string.Format("{0:X8}:\n", i); |
230 |
} |
} |
231 |
// write out the ascii data |
//// write out the ascii data |
232 |
StringBuilder builder = new StringBuilder(); |
StringBuilder builder = new StringBuilder(); |
233 |
for (uint i = address; i < (address + max_ram_view); i += max_address_width) |
for (uint i = address; i < (address + max_ram_view); i += max_address_width) |
234 |
{ |
{ |
235 |
for (uint j = 0; j < max_address_width; j++) |
try |
236 |
{ |
{ |
237 |
uint current_addr = i + j; |
for (uint j = 0; j < max_address_width; j++) |
|
if (current_addr >= MemorySize) break; |
|
|
byte ascii_value_raw = data[current_addr]; |
|
|
char ascii_value = (char)data[current_addr]; |
|
|
if (ascii_value_raw >= 0x20 && ascii_value_raw <= 0x7e) |
|
238 |
{ |
{ |
239 |
builder.Append(ascii_value.ToString()); |
uint current_addr = i + j; |
240 |
} |
if (current_addr >= MemorySize) break; |
241 |
else |
byte ascii_value_raw = data[j]; |
242 |
{ |
char ascii_value = (char)data[j]; |
243 |
builder.Append("."); |
if (ascii_value_raw >= 0x20 && ascii_value_raw <= 0x7e) |
244 |
|
{ |
245 |
|
builder.Append(ascii_value.ToString()); |
246 |
|
} |
247 |
|
else |
248 |
|
{ |
249 |
|
builder.Append("."); |
250 |
|
} |
251 |
} |
} |
252 |
|
builder.AppendLine(); |
253 |
|
} |
254 |
|
catch (Exception ex) |
255 |
|
{ |
256 |
|
logger.Error.WriteLine("{0}.UpdateMemroyView().BuildingAsciiString:{1}{2}", this.GetType().Name, System.Environment.NewLine, ex.ToString()); |
257 |
|
return; |
258 |
} |
} |
|
builder.AppendLine(); |
|
259 |
} |
} |
260 |
AsciiData = builder.ToString(); |
AsciiData = builder.ToString(); |
|
// write out the bytes |
|
|
RamData = ByteData.ToArray(); |
|
261 |
|
|
262 |
|
|
263 |
} |
} |
325 |
uint ORIGINAL_ADDR = this.CURRENT_TOP_ADDR; |
uint ORIGINAL_ADDR = this.CURRENT_TOP_ADDR; |
326 |
|
|
327 |
////if (e.Type == ScrollEventType.EndScroll) return; |
////if (e.Type == ScrollEventType.EndScroll) return; |
328 |
uint size = MemorySize; |
uint size = max_ram_view; |
329 |
|
|
330 |
bool haveModifier = false; |
bool haveModifier = false; |
331 |
switch (e.Modifiers) |
switch (e.Modifiers) |
369 |
} |
} |
370 |
if (this.CURRENT_TOP_ADDR < MemoryStart) this.CURRENT_TOP_ADDR = MemoryStart; |
if (this.CURRENT_TOP_ADDR < MemoryStart) this.CURRENT_TOP_ADDR = MemoryStart; |
371 |
//if (this.CURRENT_TOP_ADDR >= VTLB_VADDR_SIZE) this.CURRENT_TOP_ADDR = (size - 1) - max_ram_view; |
//if (this.CURRENT_TOP_ADDR >= VTLB_VADDR_SIZE) this.CURRENT_TOP_ADDR = (size - 1) - max_ram_view; |
372 |
if (this.CURRENT_TOP_ADDR + max_ram_view >= MemoryStart) this.CURRENT_TOP_ADDR = (size - 1) - max_ram_view; |
if (this.CURRENT_TOP_ADDR + max_ram_view >= MemorySize) this.CURRENT_TOP_ADDR = (size - 1); |
373 |
|
|
374 |
//this.UpdateEnabled = reenable; |
//this.UpdateEnabled = reenable; |
375 |
} |
} |
379 |
private void txtData_KeyDown(object sender, KeyEventArgs e) { this.Handle_KeyDown(sender, e); } |
private void txtData_KeyDown(object sender, KeyEventArgs e) { this.Handle_KeyDown(sender, e); } |
380 |
|
|
381 |
private void ramScroll_Scroll(object sender, ScrollEventArgs e) { this.Handle_Scroll(sender, e); } |
private void ramScroll_Scroll(object sender, ScrollEventArgs e) { this.Handle_Scroll(sender, e); } |
382 |
|
|
383 |
|
private ScrollEventArgs GetMouseWheelScrollChange(int WheelDelta) |
384 |
|
{ |
385 |
|
ScrollEventArgs args = new ScrollEventArgs(ScrollEventType.SmallIncrement,1); |
386 |
|
if (WheelDelta < 0) |
387 |
|
{ |
388 |
|
//// negative: scroll down |
389 |
|
//// SmallDecrement -or- LargeDecrement |
390 |
|
//if (WheelDelta <= small_scroll_change) |
391 |
|
//{ |
392 |
|
// args = new ScrollEventArgs(ScrollEventType.SmallDecrement,(int)small_scroll_change); |
393 |
|
//} |
394 |
|
//if (WheelDelta > small_scroll_change && WheelDelta <= large_scroll_change) |
395 |
|
//{ |
396 |
|
// args = new ScrollEventArgs(ScrollEventType.LargeDecrement, (int)large_scroll_change); |
397 |
|
//} |
398 |
|
args = new ScrollEventArgs(ScrollEventType.SmallIncrement, 1); |
399 |
|
} |
400 |
|
else |
401 |
|
{ |
402 |
|
//// positive: scroll up |
403 |
|
//// SmallIncrement -or- LargeIncrement |
404 |
|
//if (WheelDelta <= small_scroll_change) |
405 |
|
//{ |
406 |
|
// args = new ScrollEventArgs(ScrollEventType.SmallIncrement, (int)small_scroll_change); |
407 |
|
//} |
408 |
|
//if (WheelDelta > small_scroll_change && WheelDelta <= large_scroll_change) |
409 |
|
//{ |
410 |
|
// args = new ScrollEventArgs(ScrollEventType.LargeIncrement, (int)large_scroll_change); |
411 |
|
//} |
412 |
|
args = new ScrollEventArgs(ScrollEventType.SmallDecrement, 1); |
413 |
|
} |
414 |
|
return args; |
415 |
|
} |
416 |
|
|
417 |
|
void txtAddresses_MouseWheel(object sender, MouseEventArgs e) { this.Handle_Scroll(sender, GetMouseWheelScrollChange(e.Delta)); } |
418 |
|
void txtData_MouseWheel(object sender, MouseEventArgs e) { this.Handle_Scroll(sender, GetMouseWheelScrollChange(e.Delta)); } |
419 |
|
|
420 |
|
|
421 |
private void Handle_Scroll(object sender, ScrollEventArgs e) |
private void Handle_Scroll(object sender, ScrollEventArgs e) |
422 |
{ |
{ |
423 |
//isScrolling = true; |
//isScrolling = true; |
433 |
switch (e.Type) |
switch (e.Type) |
434 |
{ |
{ |
435 |
case ScrollEventType.SmallDecrement: |
case ScrollEventType.SmallDecrement: |
436 |
this.CURRENT_TOP_ADDR -= (small_scroll_change); |
if (this.CURRENT_TOP_ADDR == 0 && ((this.CURRENT_TOP_ADDR - small_scroll_change) > this.CURRENT_TOP_ADDR)) |
437 |
|
{ |
438 |
|
this.CURRENT_TOP_ADDR = ORIGINAL_ADDR; |
439 |
|
} |
440 |
|
else |
441 |
|
{ |
442 |
|
this.CURRENT_TOP_ADDR -= (small_scroll_change); |
443 |
|
} |
444 |
break; |
break; |
445 |
case ScrollEventType.SmallIncrement: |
case ScrollEventType.SmallIncrement: |
446 |
this.CURRENT_TOP_ADDR += (small_scroll_change); |
this.CURRENT_TOP_ADDR += (small_scroll_change); |
447 |
break; |
break; |
448 |
|
|
449 |
case ScrollEventType.LargeDecrement: |
case ScrollEventType.LargeDecrement: |
450 |
this.CURRENT_TOP_ADDR -= (large_scroll_change); |
if (this.CURRENT_TOP_ADDR == 0 && ((this.CURRENT_TOP_ADDR - large_scroll_change) > this.CURRENT_TOP_ADDR)) |
451 |
|
{ |
452 |
|
this.CURRENT_TOP_ADDR = ORIGINAL_ADDR; |
453 |
|
} |
454 |
|
else |
455 |
|
{ |
456 |
|
this.CURRENT_TOP_ADDR -= (large_scroll_change); |
457 |
|
} |
458 |
break; |
break; |
459 |
case ScrollEventType.LargeIncrement: |
case ScrollEventType.LargeIncrement: |
460 |
this.CURRENT_TOP_ADDR += (large_scroll_change); |
this.CURRENT_TOP_ADDR += (large_scroll_change); |