Example #1
0
 private void MenuItem_Click_1(object sender, RoutedEventArgs e)
 {
     if (LVMain.SelectedIndex >= 0)
     {
         int        index      = LVMain.SelectedIndex;
         DisasmItem disasmItem = List[index];
         string     result     = DarkStyle.InputDialog.ShowInputDialog($"汇编于{disasmItem.Address}", "输入汇编指令", disasmItem.AsmCode);
         if (result != null && result != "??")
         {
             XEDPARSE xed = new XEDPARSE();
             xed.cip   = (ulong)disasmItem.address;
             xed.instr = result;
             XEDParse.XEDParseAssemble(ref xed);
             if (xed.dest_size == 0)
             {
                 MessageBox.Show(xed.error, "汇编指令错误", MessageBoxButton.OK, MessageBoxImage.Error);
             }
             else
             {
                 if (xed.dest_size == disasmItem.length)
                 {
                     PVZ.Memory.WriteBytesStrong(disasmItem.address, xed.dest, xed.dest_size);
                     AddDisasmItem();
                 }
                 else if (xed.dest_size < disasmItem.length)
                 {
                     PVZ.Memory.WriteBytesStrong(disasmItem.address, Enumerable.Repeat <byte>(0x90, disasmItem.length).ToArray(), disasmItem.length);
                     PVZ.Memory.WriteBytesStrong(disasmItem.address, xed.dest, xed.dest_size);
                     AddDisasmItem();
                 }
                 else if (xed.dest_size > disasmItem.length)
                 {
                     if (MessageBox.Show("目标指令长度大于当前指令长度,使用nop覆盖?", "提问", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                     {
                         int length = disasmItem.length;
                         try
                         {
                             while (xed.dest_size > length)
                             {
                                 index++;
                                 length += List[index].length;
                             }
                         }
                         catch (IndexOutOfRangeException)
                         {
                             MessageBox.Show("指令长度未知", "警告", MessageBoxButton.OK, MessageBoxImage.Warning);
                             return;
                         }
                         PVZ.Memory.WriteBytesStrong(disasmItem.address, Enumerable.Repeat <byte>(0x90, length).ToArray(), length);
                         PVZ.Memory.WriteBytesStrong(disasmItem.address, xed.dest, xed.dest_size);
                         AddDisasmItem();
                     }
                 }
             }
         }
     }
 }
Example #2
0
 public static extern int XEDParseAssemble(ref XEDPARSE xedparse);
Example #3
0
 private void MenuItem_Click_1(object sender, RoutedEventArgs e)
 {
     if (LVMain.SelectedIndex >= 0)
     {
         int        index      = LVMain.SelectedIndex;
         DisasmItem disasmItem = _list[index];
         string     result     = DarkStyle.InputDialog.ShowInputDialog(
             Lang.IsChinese ? $"汇编于{disasmItem.Address}" : $"Assemble at {disasmItem.Address}",
             Lang.IsChinese ? "输入汇编指令" : "Enter assembly instructions",
             disasmItem.AsmCode, !Lang.IsChinese);
         if (result != null && result != "??")
         {
             XEDPARSE xed = new XEDPARSE();
             xed.cip   = (ulong)disasmItem.address;
             xed.instr = result;
             XEDParse.XEDParseAssemble(ref xed);
             if (xed.dest_size == 0)
             {
                 MessageBox.Show(xed.error,
                                 Lang.IsChinese ? "汇编指令错误" : "Assembly instructions error",
                                 MessageBoxButton.OK,
                                 MessageBoxImage.Error);
             }
             else
             {
                 if (xed.dest_size == disasmItem.length)
                 {
                     PVZ.Memory.WriteBytesStrong(disasmItem.address, xed.dest, xed.dest_size);
                     AddDisasmItem();
                 }
                 else if (xed.dest_size < disasmItem.length)
                 {
                     PVZ.Memory.WriteBytesStrong(disasmItem.address, Enumerable.Repeat <byte>(0x90, disasmItem.length).ToArray(), disasmItem.length);
                     PVZ.Memory.WriteBytesStrong(disasmItem.address, xed.dest, xed.dest_size);
                     AddDisasmItem();
                 }
                 else if (xed.dest_size > disasmItem.length)
                 {
                     if (MessageBox.Show(
                             Lang.IsChinese ? "目标指令长度大于当前指令长度,使用nop覆盖?" :
                             "The target instruction length is greater than the current instruction length. Use nop to cover it?",
                             Lang.IsChinese ? "提问" : "Question",
                             MessageBoxButton.YesNo,
                             MessageBoxImage.Question) == MessageBoxResult.Yes)
                     {
                         int length = disasmItem.length;
                         try
                         {
                             while (xed.dest_size > length)
                             {
                                 index++;
                                 length += _list[index].length;
                             }
                         }
                         catch (IndexOutOfRangeException)
                         {
                             if (Lang.IsChinese)
                             {
                                 MessageBox.Show("指令长度未知", "警告", MessageBoxButton.OK, MessageBoxImage.Warning);
                             }
                             else
                             {
                                 MessageBox.Show("Unknown instruction length", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
                             }
                             return;
                         }
                         PVZ.Memory.WriteBytesStrong(disasmItem.address, Enumerable.Repeat <byte>(0x90, length).ToArray(), length);
                         PVZ.Memory.WriteBytesStrong(disasmItem.address, xed.dest, xed.dest_size);
                         AddDisasmItem();
                     }
                 }
             }
         }
     }
 }